最长上升子序列

来源:互联网 发布:支付宝贷款软件 编辑:程序博客网 时间:2024/05/16 19:35

求最长上升子序列(子序列并非必须是连续的)的内容,典型的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;}