題目描述description
熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們要研究最長公共上公升子串行了。
小沐沐說,對於兩個串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
/*首先是n^3的做法,f[i][j]表示以a串的前i個整數與b串的前j個整數且以b[j]為結尾構成的lcis的長度。轉移就很好想了。
*/#include
#include
#define n 3010
using
namespace
std;
inta[n],b[n],f[n][n],n;
intmain()
f[i][j]=max(f[i][j],maxn+1
); }
}int ans=0
;
for(int i=1;i<=n;i++)ans=max(ans,f[n][i]);
printf("%d
",ans);
return0;
}
/*然後是n^2的做法,考慮優化n^3。我們可以考慮省去第三重迴圈,因為每次取的都是最大值,所以可以維護乙個最大值,可以用乙個陣列維護。但是題解給出了更好的方法:因為只有b[k]*/
#include
#include
#define n 3010
using
namespace
std;
inta[n],b[n],f[n][n],n;
intmain()
}int ans=0
;
for(int i=1;i<=n;i++)ans=max(ans,f[n][i]);
printf("%d
",ans);
return0;
}
最長公共上公升子串行
題目描述 給定兩個整數序列,求它們的最長上公升公共子串行。輸入描述 輸入兩組資料,每組資料代表乙個整數序列,其輸入格式為 第一行輸入長度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 那...
最長公共(上公升)子串行
題目 common subsequence 題目描述 給定兩個字串a和b 或數字序列 求乙個字串,使得這個字串是所給兩個字串的最長公共部分 可以不連續 動態規劃的做法 時間複雜度,o n m include include include include using namespace std co...