code 2185 最長公共上公升子串行 (dp)

2021-07-24 01:35:36 字數 1047 閱讀 8512

時間限制: 1 s

空間限制: 32000 kb

題目等級 : 鑽石 diamond

題解

檢視執行結果

熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們要研究最長公共上公升子串行了。

小沐沐說,對於兩個串a,b,如果它們都包含一段位置不一定連續的數字,且數字是嚴格遞增的,那麼稱這一段數字是兩個串的公共上公升子串,而所有的公共上公升子串中最長的就是最長公共上公升子串了。

奶牛半懂不懂,小沐沐要你來告訴奶牛什麼是最長公共上公升子串。不過,只要告訴奶牛它的長度就可以了。

輸入描述 input description

第一行n,表示a,b的長度。

第二行,串a。

第三行,串b。

輸出描述 output description

輸出長度。

樣例輸入 sample input

42 2 1 3

2 1 2 3

樣例輸出 sample output

2 資料範圍及提示 data size & hint

1<=n<=3000,a,b中的數字不超過maxlongint

題解:dp

f[i][j]表示a的前i個和b的前j個嚴格以a[i]結尾的最長公共上公升子串行的長度。

分兩種情況進行討論:

a[i]=b[j]  列舉k,保證a[k]

a[i]!=b[j]  f[i][j]=f[i][j-1]

o(n^3)  dp

#include#include#include#include#include#define n 3003

using namespace std;

int n,m,f[n][n],a[n],b[n];

int main()

int ans=0;

for (int i=1;i<=n;i++) ans=max(ans,f[i][n]);

printf("%d\n",ans);

}

CodeVS2185 最長公共上公升子串行

令f i j 表示不強制選擇a i 且強制選擇b j 的答案。之所以這麼設定,經過了一番考慮。如果你讓f i j 表示a i 和b j 都不強制選,那麼你無法確定答案所對應的結果中a i 或者b j 是否已經匹配,轉移似乎就比較比較難想 如果讓f i j 表示兩者都強制選,那麼二者不匹配時你就把答案...

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

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

最長公共上公升子串行

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