您的位置:首页 > 其它

动态规划03—最长非降子序列的长度(LIS)

2016-05-09 23:03 337 查看
最长非降子序列问题:longest increasing subsequence

是一个稍微复杂一点地动态规划问题,给定一个数组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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划