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

2021-09-27 09:28:49 字數 997 閱讀 9213

ac通道

題目含義就是求最長公共上公升子串行

首先考慮,最長公共上公升子串行 = 最長上公升子串行 + 最長公共子串行,可以通過lis和lcs的思想去考慮本題目。

定義狀態:

dp[i][j]表示a陣列的前i個和b陣列的前j個且以b[j]結尾的lcis長度
考慮狀態轉移:

轉移有兩種情況

a[ i ] == b[ j ]時候的轉移,此時需要從 j 前面找乙個比b[ j ]小的,已經構成lcis的最大長度去更新dp[ i ][ j ],因此還需要去列舉 j 前面的所有的b[ j ],因此有

if(b[k] < b[j])dp[i][j] = max(dp[i][j], dp[i - 1][k] + 1);

a[ i ] != b[ j ]時,當前的最長的長度就是dp[ i - 1] [ j ],因為dp [ i ] [ j ]一定是以b[ j ]結尾的 

考慮完狀態轉移就寫**叭

#include using namespace std;

template bool read(t & a)

else if(ch >= '0' && ch <= '9')

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

if(flag)a = -a;

return true;

}template bool read(t & a, r & ... b)

const int n = 3010;

int a[n], b[n], n, dp[n][n];

int main()

}else dp[i][j] = dp[i - 1][j];

} }int res = 0;

for (int i = 1; i <= n; i++)

cout << res;

return 0;

}

LCIS 最長公共上公升子串行

1004 tyvj1071 lcis最長公共上公升子串行 description 熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們要研究最長公共上公升子串行了。小沐沐說,對於兩個串a,b,如果它們都包含一段位置不一定連續的...

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