动态规划03—最长非降子序列的长度(LIS)
2016-05-09 23:03
337 查看
最长非降子序列问题:longest increasing subsequence
是一个稍微复杂一点地动态规划问题,给定一个数组array
,求最大的非降子序列的长度。同样,该问题可以先求解array[i],其中i小于N。
同样,该动态规划问题中的状态和状态转移方程为:
状态d[i]表示以array[i]结尾的数组的LIS;
状态转移方程为
比如
则
该问题也是比较简单直观的问题,下面直接给出求解:
是一个稍微复杂一点地动态规划问题,给定一个数组array
,求最大的非降子序列的长度。同样,该问题可以先求解array[i],其中i小于N。
同样,该动态规划问题中的状态和状态转移方程为:
状态d[i]表示以array[i]结尾的数组的LIS;
状态转移方程为
d(i) = max{1, d(j)+1},其中j<i,A[j]<=A[i]
比如
5,3,4,8,6,7
则
子序列不要求连续 d[1]=1 (5) d[2]=1 (3) d[3]=2 (3,4) d[4]=3 (3,4,8) d[5]=3 (3,4,6) d[6]=4 (3,4,6,7)
该问题也是比较简单直观的问题,下面直接给出求解:
int lis(vector<int> &nums){ vector<int> rets(nums.size(),1); int len=1; for(int i=1;i!=nums.size();i++){ for(int j=0;j!=i;j++){ if(nums[j]<nums[i]) rets[i]=std::max(rets[i],rets[j]+1); } if(rets[i]>len) len=rets[i] } return len; }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题
- USACO 3.2.2:Stringsobits
- 字符串编辑距离