1. 程式人生 > >動態規劃03—最長非降子序列的長度(LIS)

動態規劃03—最長非降子序列的長度(LIS)

最長非降子序列問題: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; }