動態規劃 最長公共上公升子串行LCIS

2022-04-28 16:30:13 字數 523 閱讀 8325

問題

給定兩個序列a和b,序列的子串行是指按照索引逐漸增加的順序,從原序列中取出若干個數形成的乙個子集,若子串行的數值大小是逐漸遞增的則為上公升子串行,若a和b取出的兩個子串行a1和b1是相同的,則a1/b1為a和b的公共子串行。求出a和b的最長公共上公升子串行。

分析

if (a[i] != b[j])

dp[i][j] = dp[i-1][j];

else

dp[i][j] = max(dp[i-1][k]) + 1; (1 <= k <= j - 1 && b[j] > b[k])

實現

for(int i = 1; i <= n; i ++)

}int mm = 0;

for(int i = 1;i <= m; i ++)

mm = max(mm, dp[n][i]);

動態規劃 最長公共上公升子串行

對於做dp的人而言,規劃處最優子結構是解決一切題目的第一步,二此題的最優越子結構規劃一下,dp i j 為序列1前i個元素和序列2前j個元素最長公共上公升子串行多長。那麼這個時候初始值初始化為0的話,碰到序列1和序列2相等的情況只要依靠相等位置前的序列來得出狀態即可,更新完整個dp陣列。如下 inc...

最長公共上公升子串行

題目描述 給定兩個整數序列,求它們的最長上公升公共子串行。輸入描述 輸入兩組資料,每組資料代表乙個整數序列,其輸入格式為 第一行輸入長度m 1 m 500 第二行輸入該序列的m個整數ai 231 ai 231 輸出描述 輸出共兩行。第一行輸出兩個序列的最長上公升公共子串行的長度l 第二行輸出該子串行...

最長公共上公升子串行

首先,在 a i b j 的時候有 dp i j dp i 1 j 為什麼呢?因為 dp i j 是以b j 為結尾的 lcia 如果dp i j 0 那麼就說明 a 1 a i 中必然有乙個字元 a k 等於b j 如果dp i j 等於0 呢?那賦值與否都沒有什麼影響了 因為 a k a i 那...