動態規劃練習一 04 公共子串行

2021-07-30 10:22:37 字數 1267 閱讀 8694

描述

我們稱序列z = < z

1, z

2, ..., z

k >是序列x = < x

1, x

2, ..., x

m >的子串行當且僅當存在嚴格上公升的序列< i

1, i

2, ..., i

k >,使得對j = 1, 2, ... ,k, 有x

ij = z

j。比如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

**翻譯自southeastern europe 2003的試題

這道題為動態規劃問題,因為要比較兩串字元,我們可以用乙個二維陣列下標分別表示兩串字元的下標,用陣列數表示到這兩個下標的最長公共字串,這樣問題就容易解決了。

源**如下:

#include

using

namespace std;

intmain

(),max=0;

x=strlen

(a);

y=strlen

(b);

for(i=

1;i<=x;++i)

for(j=

1;j<=y;++j)

}for

(i=1

;i<=x;++i)

for(j=

1;j<=y;++j)

cout<}}

需要注意的是不要讓f[i-1][j-1]越界,所以for迴圈從1開始,字串下標用i-1跟j-1表示,這樣問題就解決了 。

動態規劃 04公共子串行

題目 輸入兩串字串,求這兩串字串中公共子串行的最長長度。解題思路 用二維陣列f來存公共字串的最長長度,如果a i 1 b j 1 那麼公共子串行長度增加一位,如果a i 1 b j 1 則f i j max,通過兩重迴圈到最後得出的結果即是最大值。細節處理 通過while輸入陣列字串,定義乙個max...

動態規劃 公共子串行

公共子串行 總時間限制 1000ms 記憶體限制 65536kb 描述 我們稱序列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 的子串行。現在給...

動態規劃 公共子串行

輸入兩個字串,輸出其中最長的公共子串行。狀態 有兩個字串,就要有兩個控制狀態的變數a i j 第乙個字串的第i個字元,第二個字串的第j個字元。b i 是第乙個字串,c i 是第二個字串。子問題 求第乙個字串的第i個字元和第二個字串的第j個字元是不是相等。狀態轉移方程 第乙個字串的第i個字元和第二個字...