最長單調子串行(動態規劃)

2021-09-25 16:40:27 字數 1113 閱讀 6626

最長上公升子串行(longest increasing subsequence),簡稱lis,也有些情況求的是最長非降序子串行,二者區別就是序列中是否可以有相等的數。

例如:對於序列(1, 7, 3, 5, 9, 4, 8),我們就會得到一些上公升的子串行,如(1, 7, 9), (3, 4, 8), (1, 3, 5, 8)等等,而這些子串行中最長的(如子串行(1, 3, 5, 8) ),它的長度為4,因此該序列的最長上公升子串行長度為4。

子串和子串行的概念:

(1)字元子串指的是字串中連續的n個字元,如abcdefg中,ab,cde,fg等都屬於它的字串。

(2)字元子串行指的是字串中不一定連續但先後順序一致的n個字元,即可以去掉字串中的部分字元,但不可改變其前後順序。如abcdefg中,acdg,bdf屬於它的子串行,而bac,dbfg則不是,因為它們與字串的字元順序不一致。

子串行、公共子串行以及最長公共子串行都不唯一,但很顯然,對於固定的陣列,雖然lis序列不一定唯一,但lis的長度是唯一的。如:給出序列 ( 1, 7, 3, 5, 9, 4, 8),易得最長上公升子串行長度為4,這是確定的,但序列可以為 ( 1, 3, 5, 8 ), 也可以為 ( 1, 3, 5, 9 )。

動態規劃 :要求n個數的最長上公升子串行,可以求前n-1個數的最長上公升子串行,再跟第n個數進行判斷。求前n-1個數的最長上公升子串行,可以通過求前n-2個數的最長上公升子串行……直到求前1個數的最長上公升子串行,此時lis為1。

樣例輸入:

7

1 7 3 5 9 4 8

樣例輸出:

4
**實現:

#include #include using namespace std;

int main()

for(i=0; ifor(j=0; jif(a[j]b[i]=max(b[i],b[j]+1);

sort(b,b+n);

cout<}

return 0;

}

動態規劃 最長單調子串行問題

求乙個正整數序列的最長單調自增子序列,子串行不要求是連續的。例如 input 5 5 2 4 3 1 output 2 確定狀態轉移方程,設f i 是以a i 為結尾的最大值的子串行的長度,那麼 max 的最大值就是要的結果。所以轉移方程為 f i max 1 所以 可以為 void main vo...

最長單調遞增子串行 動態規劃

給定乙個序列x 0 n 找出它的最長的單調遞增子串行 longest increasing subsequence 使用動態規劃方法。對於i 1,2,n,考慮以xi作為最後項的最長遞增子串行的長度c i 如果在xi項前面存在xj xi 那麼 c i max 1 否則,c i 1.因此,c i max...

單調遞增最長子序列(動態規劃)

求乙個字串的最長遞增子串行的長度 如 dabdbf最長遞增子串行就是abdf,長度為4 第一行乙個整數0輸出字串的最長遞增子串行的長度 3 aaaababc abklmncdefg 137 ac 1 include2 include 3 include4 using namespace std 5c...