03 公共子串行
描述我們稱序列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
分析
分解問題:
將問題分解為「從開頭到s1 串的第i個字元與到s2 串的第j個字元之間的最長公共子串行」。
找出狀態遷移方程:
如果 s1[
i−1]
==s2
[j−1
]s_1[i-1]==s_2[j-1]
s1[i−
1]==
s2[
j−1]
,那麼 max
len(
i,j)
=max
len(
i−1,
j−1)
+1
maxlen(i,j)=maxlen(i-1,j-1)+1
maxlen
(i,j
)=ma
xlen
(i−1
,j−1
)+1這裡的反面條件是本題的難點:如果s1[
i−1]
!=s2
[j−1
]s_1[i-1] !=s_2[j-1]
s1[i−
1]!=
s2[
j−1]
,m ax
len(
i,j)
maxlen( i , j )
maxlen
(i,j
)會如何變化呢?
它首先肯定不會小於max
len(
i−1,
j−1)
、max
len(
i,j−
1)、m
axle
n(i−
1,j)
maxlen( i-1 , j-1 )、maxlen( i , j-1 )、maxlen( i-1 , j )
maxlen
(i−1
,j−1
)、ma
xlen
(i,j
−1)、
maxl
en(i
−1,j
),因為比他們多了若干個字元
但是它肯定不可能同時大於max
len(
i,j−
1)、m
axle
n(i−
1,j)
maxlen( i , j-1 )、maxlen( i-1 , j )
maxlen
(i,j
−1)、
maxl
en(i
−1,j
)。假設其同時大於這兩者,那麼其值只能是這兩者的值+1,而其值+1,則只有 s1[
i−1]
、s2[
j−1]
s_1[i-1]、s_2[j-1]
s1[i−
1]、s
2[j
−1]分別都在最長子序列中才可能發生,那麼最長子序列的最後一位分別是這倆字元,而這倆字元又不相等,引發了矛盾。
故而我們可以發現 max
len(
i,j)
=max
(max
len(
i,j−
1),m
axle
n(i−
1,j)
)maxlen(i,j)=max(maxlen(i,j-1),maxlen(i-1,j))
maxlen
(i,j
)=ma
x(ma
xlen
(i,j
−1),
maxl
en(i
−1,j
))。 直觀上來說,如果s1[
i−1]
!=s2
[j−1
]s_1[i-1] !=s_2[j-1]
s1[i−
1]!=
s2[
j−1]
,我們就只能選取乙個方向繼續前進,而方向的選擇則是:選取較大的
#include
#include
using
namespace std;
string s1, s2;
int dp[
205]
[205];
intmain()
intf
(int loc1,
int loc2)
else
}
公共子串行
最長公共子串行問題 給定2個字串,求其最長公共子串。如abcde和dbada的最長公共字串為bd。動態規劃 dp i j 表示a串前i個和b串前j個的最長公共子串的長度。則若a i b j dp i j dp i 1 j 1 1 否則 dp i j max dp i 1 j dp i j 1 時間複...
dp 公共子串行
描述 我們稱序列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的最大公共子串行,也就是說要...
dp C 公共子串行
給定兩個字串 s1,s2 求它們的 lcs 滿足 s1 leq 10 6,s2 leq 10 3 考場寫了 o s1 s2 成功tle,考慮突破口為 s2 不夠大,考慮轉為判定,設 dp i j 表示原來存在最小的 k 使得 f k i geq j 不存在為 n 1 那麼 dp i j min 然後...