給定兩個序列
x =
y =
求x和y的乙個最長公共子串行
舉例x =
y =
最長公共子串行為
lsc =
分析:最長公共子串行問題具有最優子結構性質
設x =
y =
及它們的最長子序列
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 的最長公共子串行
由性質匯出子問題的遞迴結構
當 i = 0 , j = 0 時 , c[i][j] = 0
當 i , j > 0 ; xi = yi 時 , c[i][j] = c[i-1][j-1] + 1
當 i , j > 0 ; xi != yi 時 , c[i][j] = max
// 書中只有關鍵部分的**,現在已經補全
// 源程式
#include "iostream.h"
#include "iomanip.h"
#define max 100
void lcslength( int m , int n , char *x , char *y , char *b )
for( i = 1 ; i <= n ; i++ )
for( i = 1 ; i <= m ; i++ )
else if( c[i-1][j] >= c[i][j-1] )
else}}
}void lcs( int i , int j , char *x , char *b , int width )
;char y[max] = ;
int m = 7;
int n = 6;
char b[max] = ;
lcslength( m , n , x , y , b );
lcs( m , n , x , b , n );
cout< } longest common subsequence problem 序列x和y,找到z為x和y的最大公共子串行 蠻力列舉 從x的長度為1序列開始列舉,在y中查詢是否有該序列 列舉觀察,長度為x 1的子串行是長度為x的子串行的一部分 存在最優子結構和重疊子問題,適合動態規劃 1 問題結構分析 c i... 公共子串是連續的,而公共子串行不是連續的。x1 abcc x2 acbcc x1和x2的公共子串為 bcc 公共子串行為 abcc 我們來看一下兩個問題的轉移方程 最長公共子串 dp i j 0 if i 0 or j 0 dp i j dp i 1 j 1 1 if x1 i x2 j dp i ... 最長公共子串行問題 longest common subsequence problem 簡稱lcs問題。題目為給定兩個序列x y求它們的lcs 最長公共子串行 這裡的子串行z的定義為 z中的元素既在x中也在y中,並且他們在x y中滿足嚴格的下標為乙個增序列 假設下標從左到右依次增大 另外,不要求z...最長公共子串行問題 最長公共子串問題 動態規劃
最長公共子串與最長公共子串行問題(動態規劃)
動態規劃 最長公共子串行問題