最長公共上公升子串行(LCIS)

2021-09-27 12:44:54 字數 1492 閱讀 7347

題解熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。

小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們研究最長公共上公升子串行了。

小沐沐說,對於兩個數列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 此序列的 最長上...