動態規劃,最長公共子串行

2021-10-08 01:42:33 字數 1148 閱讀 3655

1808:公共子串行

描述我們稱序列z = < z1, z2, …, zk >是序列x = < x1, x2, …, xm >的子串行當且僅當存在 嚴格上公升 的序列< i1, i2, …, ik >,使得對j = 1, 2, … ,k, 有xij = zj。比如z = < a, b, f, c > 是x = < a, b, c, f, b, c >的子串行。

現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串行,也就是說要找到乙個最長的序列z,使得z既是x的子串行也是y的子串行。
輸入

輸入包括多組測試資料。每組資料報括一行,給出兩個長度不超過200的字串,表示兩個序列。兩個字串之間由若干個空格隔開。

輸出對每組輸入資料,輸出一行,給出兩個序列的最大公共子串行的長度。

樣例輸入

abcfbc         abfcab

programming contest

abcd mnp

樣例輸出

4

20

思路:

1.子問題,f(i,j) 從s1的前i個字元和s2的前j個字串組成最長的公共子串行

2.邊界f(i,0),f(0,j) 當其中乙個為空,就是0

3.狀態轉移方程

if(s1[i-1]==s2[j-2]) s1和s2當前最後乙個是相等

f(i,j)=f(i-1,j-1)+1 前面i-1和j-1形成的最長公共子串行再+1

else f(i,j)=max(f(i-1,j),f(i,j-1))

#include

#include

#include

using

namespace std;

int maxlen[

300]

[300];

intmain()

else maxlen[i]

[j]=

max(maxlen[i -1]

[j], maxlen[i]

[j -1]

);} cout << maxlen[len1]

[len2]

<< endl;

}}

動態規劃 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上公升的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串行,也就是說要...

動態規劃 最長公共子串行

兩個序列的最長公共子序 lcs longest common length 的 每個字元可以不連續,如x y 那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到 最精髓的 狀態轉移方程 假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r i j 自底往上 那麼x i 與y...

動態規劃 最長公共子串行

看完演算法導論關於這部分內容之後的總結 關於最長公共子串行問題 給定兩個子串行 x y 求x和y長度最長的公共子串行。解決方法 首先先要了解lcs的最優子結構,令x y 為兩個子串行,z 為x和y的任意lcs。1 如果 xm yn 則 zk xm yn 且 zk 1 是 xm 1 和 yn 1 的乙...