動態規劃03—最長非降子序列的長度(LIS)
阿新 • • 發佈:2019-01-26
最長非降子序列問題:longest increasing subsequence
是一個稍微複雜一點地動態規劃問題,給定一個數組array[N],求最大的非降子序列的長度。同樣,該問題可以先求解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;
}