最長公共子串行(線性DP)

2021-10-18 07:10:28 字數 1141 閱讀 9596

給定兩個長度分別為n和m的字串a和b,求既是a的子串行又是b的子串行的字串長度最長是多少。

第一行包含兩個整數n和m。

第二行包含乙個長度為n的字串,表示字串a。

第三行包含乙個長度為m的字串,表示字串b。

字串均由小寫字母構成。

輸出乙個整數,表示最大長度。

1≤n,m≤1000

4 5

acbd

abedc

3
集合表示:f[ i ][ j ]表示a的前 i 個字母,和b的前 j 個字母的最長公共子串行長度

集合劃分:以a[i],b[j]是否包含在子串行當中為依據,因此可以分成四類:

①a[i]不在,b[j]不在

max=f[ i − 1 ][ j − 1 ]

②a[ i ]不在,b[ j ]在

看似是max=f[ i − 1 ][ j ] , 無法實際上無法用f[ i − 1 ][ j ]表示,因為f[ i − 1 ][ j ]表示的是在a的前i-1個字

母**現,並且在b的前j個字母**現,此時b[j]不一定出現,這與條件不完全相等,條件給定是a[i]一定不

在子串行中,b[j]一定在子串行當中,但仍可以用f[i−1][j]來表示,原因就在於條件給定的情況被包含在

f[i−1][j]中,即條件的情況是f[i−1][j]的子集,而求的是max,所以對結果不影響。

③a[i]在,b[j]不在 原理同上

④a[i]在,b[j]在 max=f[i−1][j−1]+1

#include#include#include#includeusing namespace std;

const int n = 1010;

int f[n][n];

char x[n], y[n];

int main()

cout << f[n][m] << endl;

return 0;

}

線性DP 最長公共子串行

給定兩個長度分別為n和m的字串a和b,求既是a的子串行又是b的子串行的字串長度最長是多少。思路 輸入格式 第一行包含兩個整數n和m。第二行包含乙個長度為n的字串,表示字串a。第三行包含乙個長度為m的字串,表示字串b。字串均由小寫字母構成。輸出格式 輸出乙個整數,表示最大長度。資料範圍 1 n 100...

DP 最長公共子串行

解題報告 題目 演算法 dp 最長公共子串行 思路 最長公共子串行,英文縮寫為lcs longest common subsequence 其定義是,乙個數列 s 如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。d i j 表示s1的第i位...

最長公共子串行 DP

有序子串行定義 若x 則它的子串行為y 即原序列調出若干項組成的序列且下標要求有序。lcs 最長公共子串行 定義 給定兩個序列x 和y 存在乙個嚴格遞增的x的下標序列為,對所有的j 1,2,3.k,滿足xi yj,例如x 1 4 3 2 5 y 4 3 5 7 則x和y的最長公共子串行為 4 3 5...