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