您的位置:首页 > 其它

最长上升子序列

2017-10-28 15:48 141 查看
求最长上升子序列(子序列并非必须是连续的)的内容,典型的dp问题

解法如下

假定f(i)表示为前i个数字中以第i个数字结尾的
LIS 长度则

f(j)=max(f(i)+1)  i<j && l[j]>l[i]

    =1               others

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int longestIncreasingSubsequence(const vector<int>&v){
if(v.empty())return 0;
vector<int>ret(v.size(),1);
for(int i=1;i!=ret.size();++i){
for(int j=0;j!=i;++j){
if(ret[i]<ret[j]+1 && v[i]>v[j])ret[i]=ret[j]+1;
}
}
return *max_element(ret.begin(),ret.end());
}

vector<int>LIS(const vector<int>&v){
if(v.empty())return vector<int>{};
vector<int>ret(v.size(),1);
for(int i=1;i!=ret.size();++i){
for(int j=0;j!=i;++j){
if(ret[i]<ret[j]+1 && v[i]>v[j])ret[i]=ret[j]+1;
}
}

auto end=max_element(ret.begin(),ret.end());
auto num=*end;
vector<int>res(num);
auto j=end-ret.begin();
for(;j>=0;--j){
if(ret[j]==num){
--num;
res[num]=v[j];
}
}
return res;
}

int main(){
vector<int>v{4,2,4,5,3,7};
cout<<longestIncreasingSubsequence(v)<<endl;
auto r=LIS(v);
for(auto i:r)
cout<<i<<",";
cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: