最長公共上公升子串行

2021-07-23 15:18:47 字數 1051 閱讀 2542

首先,在

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]

,那麼a[i]

對dp[i][j]

沒有貢獻,於是我們不考慮它照樣能得出

dp[i][j]

的最優值。所以在

a[i]!=b[j]

的情況下必然有

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

。這一點參考

lca的處理方法。

在a[i]=b[j]時,記錄了乙個max來記錄在i前面比a[i]小的b[j]對應的f[i][j],這樣當a[i]=b[j]時,就直接在其基礎上加一就可以了。

拿一對序列來舉例:

2 1 6 3 4 9 10

3 2 6 4 5 9 8

碰到a[5]的時候,b[4]==a[5]==4

,b[4]前面比4小的b[j]有b[1],b[2],那麼max就記錄其最大值,之後便將其加一得到了f[5][4]

#include

#include

#include

using namespace std;

long long a[3010],b[3010];

int f[3010][3010];

int main()

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

ans=max(ans,f[i][j]);//完全可以在過程中直接記錄最大值}}

cout<

最長公共上公升子串行

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

最長公共(上公升)子串行

題目 common subsequence 題目描述 給定兩個字串a和b 或數字序列 求乙個字串,使得這個字串是所給兩個字串的最長公共部分 可以不連續 動態規劃的做法 時間複雜度,o n m include include include include using namespace std co...

最長公共上公升子串行

熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們研究最長公共上公升子串行了。小沐沐說,對於兩個數列a和b,如果它們都包含一段位置不一定連續的數,且數值是嚴格遞增的,那麼稱這一段數是兩個數列的公共上公升子串行,而所有的公共上...