題解熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。
小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們研究最長公共上公升子串行了。
小沐沐說,對於兩個數列a和b,如果它們都包含一段位置不一定連續的數,且數值是嚴格遞增的,那麼稱這一段數是兩個數列的公共上公升子串行,而所有的公共上公升子串行中最長的就是最長公共上公升子串行了。
奶牛半懂不懂,小沐沐要你來告訴奶牛什麼是最長公共上公升子串行。
不過,只要告訴奶牛它的長度就可以了。
數列a和b的長度均不超過3000。
第一行包含乙個整數n,表示數列a,b的長度。
第二行包含n個整數,表示數列a。
第三行包含n個整數,表示數列b。
輸出乙個整數,表示最長公共子串行的長度。
1≤n≤3000,序列中的數字均不超過231−
12^−1
231−14
2 2 1 3
2 1 2 3
d p[
i][j
]=
dp[i][j]=
dp[i][
j]=a
1a_1
a1…a
ia_i
ai和b
1b_1
b1…b
jb_j
bj對應的lcs的長度
d p[
0][j
]=
0dp[0][j]=0
dp[0][
j]=0dp
[i][
j]
=dp[i-1][j-1]+1& \text=b_)$}\\ max(dp[i-1][j],dp[i][j-1])& \text \end
dp[i][
j]= max(dp[i-1][j],dp[i-1][t]+1)& \text=b_$)}\\ dp[i-1][j]& \text \end
dp[i][
j]= f[t]+1& \text=b_)$}\\ f[j]& \text \end
f[j]=}
int res =0;
for(
int i =
1; i <= n; i++
) res =
max(res, f[n]
[i])
; cout<}一維優化
#include
using namespace std;
const
int n =
3005
;int a[n]
, b[n]
;int f[n]
;int n;
intmain
(void)}
int res =0;
for(
int i =
1; i <= n; i++
) res =
max(res, f[i]);
cout<}
LCIS 最長公共上公升子串行
1004 tyvj1071 lcis最長公共上公升子串行 description 熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們要研究最長公共上公升子串行了。小沐沐說,對於兩個串a,b,如果它們都包含一段位置不一定連續的...
LCIS (最長公共上公升子串行)
ac通道 題目含義就是求最長公共上公升子串行 首先考慮,最長公共上公升子串行 最長上公升子串行 最長公共子串行,可以通過lis和lcs的思想去考慮本題目。定義狀態 dp i j 表示a陣列的前i個和b陣列的前j個且以b j 結尾的lcis長度考慮狀態轉移 轉移有兩種情況 a i b j 時候的轉移,...
最長公共上公升子串行 LCIS
剛開始看這個問題的時候,第一反應是先求出lcs再求出lcs的lis,事實上這是有問題的,我們並不能保證這麼求出的lcis是最長的,比如下面這個例子 example a 7 1 5 6 4 2 7 b 7 1 5 4 6 7 2 按照遞迴的取 最長公共子串行 取出 7 1 5 6 2 此序列的 最長上...