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

2021-08-07 09:09:02 字數 2267 閱讀 7374

參考自 <<

題目描述

給出兩個字串,求兩個字串的最長公共字串。

輸入

abcfbc abfcab

programming contest

abcd mnp

輸出

4 2

0分析

可以看出:

f[i][j]=f[i-1][j-1]+1;(a[i]==b[j])

f[i][j]=max(f[i-1][j],f[i][j-1])(a[i]!=b[j]);

n由於f(i,j)只和f(i-1,j-1), f(i-1,j)和f(i,j-1)有關, 而在計算f(i,j)時, 只要選擇乙個合適的順序, 就可以保證這三項都已經計算出來了, 這樣就可以計算出f(i,j). 這樣一直推到f(len(a),len(b))就得到所要求的解了.

**

#include

#include

#include

#include

#include

using

namespace

std;

int dp[1100][1100];

char s1[1000],s2[1000];

int main()

}printf("%d\n",dp[len1][len2]);

}return

0;}

給出兩個字串,求兩個字串的最長公共字串及列印公共子串

輸入

abcfbc abfcab

programming contest

abcd mnp

輸出

lcs=4

a b c b

lcs=2

o n

lcs=0

**

#include

#include

#include

#include

#include

using

namespace

std;

int dp[110][110],path[110][110];

char s1[110],s2[110];

void lcs(int len1,int len2)

else

if(dp[i][j-1]<=dp[i-1][j])else}}

printf("lcs=%d\n",dp[len1][len2]);

}void print(int x,int y)

else

if(path[x][y]==2)else

if(path[x][y]==3)

}int main()

給定兩個字串,輸出兩個字串公共不重複部分。

輸入

輸出

**

將兩個字串結合起來,他們的公共子串只輸出一次。

根據lcs的原理,將每個字元都進行標記,看兩個字串中對應的字元究竟處於什麼狀態,然後輸出,其標記為公共子串的字元只輸出一次即可。

注意陣列的初始化。

#include

#include

#include

#include

#include

using namespace std;

int dp[110][110],path[110][110];

char s1[110],s2[110];

void lcs(int len1,int len2)

else

if(dp[i][j-1]<=dp[i-1][j])else}}

/*for(int i=1;i<=len1;i++)

printf("\n");

}printf("lcs=%d\n",dp[len1][len2]);

*/}void print(int

x,int

y)else

if(path[x][y]==2)else

if(path[x][y]==3)

}int main()

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

longest common subsequence problem 序列x和y,找到z為x和y的最大公共子串行 蠻力列舉 從x的長度為1序列開始列舉,在y中查詢是否有該序列 列舉觀察,長度為x 1的子串行是長度為x的子串行的一部分 存在最優子結構和重疊子問題,適合動態規劃 1 問題結構分析 c i...

動態規劃 最長公共子串行問題(LCS)

若給定序列x 則另一串行z 是x的子串行 是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子串行,相應的遞增下標序列為。給定2 個序列x和y 當另一串行z既是 x的子串行又是 y的子串行時,稱 z是序列x和 y的公共子串行。例如,序列x y 的子串行...

最長公共子串行(LCS)問題

問題描述 見演算法導論p208 p209 前提概念 給定乙個序列x x1,x2,xm 對i 0,1,m,記x的第i個字首為xi x1,x2,xi 故xm x,而x0是個空序列 乙個給定序列的子串行就是該序列去掉0個或多個元素 不一定連續 如bcdb是abcbdab的乙個子串行 基於以上定義,最長公共...