1. 描述
給定兩個序列
x = ,y =
求x和y的乙個最長公共子串行。
2. 分析
設最長子序列 z = 則
1、若 xm = yn , 則 zk = xm = yn,且z[k-1] 是 x[m-1] 和 y[n-1] 的最長公共子串行;
2、若 xm != yn ,且 zk != xm , 則 z 是 x[m-1] 和 y 的最長公共子串行;
3、若 xm != yn , 且 zk != yn , 則 z 是 y[n-1] 和 x 的最長公共子串行
設c[i][j]為序列xi和yj的乙個lcs長度,
則得出遞推公式:
c[i][j] = 0 當 i = 0 , j = 0 時 ,
c[i][j] = c[i-1][j-1] + 1 當 i , j > 0 ; xi = yi 時 ,
c[i][j] = max 當 i , j > 0 ; xi != yi 時
3. **
void lcs(char x, char y)
else if (c[i][j - 1] >= c[i - 1][j])
else
}for (i = 1; i <= lenx; i++)
printf("%d\n", c[lenx][leny]);
printlcs(lenx, leny, b, x);
}
其中構造乙個lcs最優解的函式如下:
void printlcs(int m, int n, char b[m + 1][n + 1], char x)
void print(int m, int n, char b[m + 1][n + 1], char x, int i, int j)
else if (b[i][j] == '
print(m, n, b, x, i, j - 1);
else
print(m, n, b, x, i - 1, j);
}
測試如下:
#include #include void lcs(char x, char y);
void printlcs(int m, int n, char b[m + 1][n + 1], char x);
void print(int m, int n, char b[m + 1][n + 1],char x, int i, int j);
int main(void)
輸出:![](https://pic.w3help.cc/c72/506b3c382f7120f03eeb407d90919.jpeg)
最長公共子串行(LCS) 動態規劃
首先,動態規劃的關鍵是將之前所計算的結果儲存起來,之後直接呼叫!1.問題描述 字串的子串行 是指從該字串中去掉任意多個字元後剩下的字元在不改變順序的情況下組成的新字串。最長公共子串行 是指多個字串可具有的長度最大的公共的子串行。比如 adbcbd bdcaba這兩個字串的最長公共子串行是dcb 2....
動態規劃 最長公共子串行(LCS)
最長公共子串行也是動態規劃中的乙個經典問題。有兩個字串 s1 和 s2,求乙個最長公共子串,即求字串 s3,它同時為 s1 和 s2 的子串,且要求它的長度最長,並確定這個長度。這個問題被我們稱為最長公共子串行問題。與求最長遞增子串行一樣,我們首先將原問題分割成一些子問題,我們用 dp i j 表示...
動態規劃 最長公共子串行 LCS
動態規劃 最長公共子串行 lcs 題目描述 給定兩個字串 或數字序列 a和b,求乙個字串,使得這個字串是a和b的最長公共部分 子串行可以不連續 如樣例所示,字串 sadstory 與 adminsorry 的最長公共子串行為 adsory 長度為6 動態規劃的解法 令dp i j 表示字串a的i號位...