LCIS 最長公共上公升子串行

2021-08-28 17:07:06 字數 1651 閱讀 3284

1004 – 【tyvj1071】lcis最長公共上公升子串行

description

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

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

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

input

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

第二行,串a。

第三行,串b。

output

輸出長度。

sample input

42 2 1 3

2 1 2 3

sample output

2*狀態轉移方程:

①f[i][j] = f[i-1][j] (a[i] != b[j])

②f[i][j] = max(f[i-1][k]+1) (1 <= k <= j-1 && b[j] > b[k])

現在我們來說為什麼會是這樣的狀態轉移方程呢?

對於①,因為f[i][j]是以b[j]為結尾的lcis,如果f[i][j]>0那麼就說明a[1]…a[i]中必然有乙個整數a[k]等於b[j],因為a[k]!=a[i],那麼a[i]對f[i][j]沒有貢獻,於是我們不考慮它照樣能得出f[i][j]的最優值。所以在a[i]!=b[j]的情況下必然有f[i][j]=f[i-1][j]。

對於②,前提是a[i] == b[j],我們需要去找乙個最長的且能讓b[j]接在其末尾的lcis。之前最長的lcis在哪呢?首先我們要去找的f陣列的第一維必然是i-1。因為i已經拿去和b[j]配對去了,不能用了。並且也不能是i-2,因為i-1必然比i-2更優。第二維呢?那就需要列舉b[1]…b[j-1]了,

因為你不知道這裡面哪個最長且哪個小於b[j]。這裡還有乙個問題,可不可能不配對呢?也就是在a[i]==b[j]的情況下,需不需要考慮f[i][j]=f[i-1][j]的決策呢?答案是不需要。因為如果b[j]不和a[i]配對,那就是和之前的a[1]…a[j-1]配對(假設f[i-1][j]>0,等於0不考慮),

這樣必然沒有和a[i]配對優越。為什麼必然呢?

因為b[j]和a[i]配對之後的轉移是max(f[i-1][k])+1,而和之前的i配對則是max(f[i-1][k])+1。

#include#includeusing namespace std;

const int maxn=5005;

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

inline int read()

while(ch>='0'&&ch<='9')

return s*w;

}int main()

} maxx=0;

for(i=1;i<=n;i++)if(maxxprintf("%d",maxx);

return 0;

}

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

ac通道 題目含義就是求最長公共上公升子串行 首先考慮,最長公共上公升子串行 最長上公升子串行 最長公共子串行,可以通過lis和lcs的思想去考慮本題目。定義狀態 dp i j 表示a陣列的前i個和b陣列的前j個且以b j 結尾的lcis長度考慮狀態轉移 轉移有兩種情況 a i b j 時候的轉移,...

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

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

最長公共上公升子串行 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 此序列的 最長上...