動態規則 最長公共子串行問題

2021-04-01 20:36:02 字數 1139 閱讀 3447

給定兩個序列

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...