時間限制: 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 第二行輸出該子串行...