最长上升子序列
来源:互联网 发布:支付宝贷款软件 编辑:程序博客网 时间: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;}
阅读全文
0 0
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- Linux常用命令之cd
- Postgres设置特定数据库的连接数为0
- HDU5273--Dylans loves sequence
- UML建模
- 1134 最长递增子序列(时间复杂度O(n*log(n))
- 最长上升子序列
- 大众这家车企,在电动汽车和自动驾驶上将有哪些举动?
- 步步高再次杀入手机红海,imoo能否成为第二个OPPO?
- Spring boot整合Springfox在线生成restful的api doc
- 编译原理——3.3 词法单元的规约
- Postgres使用ALTER USER命令修改用户的密码、密码过期,锁定,解锁
- 简单MySQL教程二
- Postgres密码安全
- 实现数组和对象的深浅拷贝