首先,在
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,如果它們都包含一段位置不一定連續的數,且數值是嚴格遞增的,那麼稱這一段數是兩個數列的公共上公升子串行,而所有的公共上...