給定兩個長度分別為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...