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

2021-06-28 18:59:33 字數 1134 閱讀 5501

最長公共子串行也稱作最長公共子串(不要求連續),英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。

例如:x(a,

b,c,b,d,a,b)

y  (b,d,c,a,b,a)

那麼最長公共子串行就是:b,c,b,a(細心地朋友已經發現了不止一種子串行,但長度一樣,至於輸出嗎,就看**吧)

演算法設計:用動態規劃方法解決

最長公共子串行的結構:

設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

問題的遞迴式寫成:

回溯輸出最長公共子串行過程**:

演算法分析:

由於每次呼叫至少向上或向左(或向上向左同時)移動一步,故最多呼叫(m + n)次就會遇到i = 0或j = 0的情況,此時開始返回。返回時與遞迴呼叫時方向相反,步數相同,故演算法時間複雜度為o(m + n)。

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

最長公共子串行問題 longest common subsequence problem 簡稱lcs問題。題目為給定兩個序列x y求它們的lcs 最長公共子串行 這裡的子串行z的定義為 z中的元素既在x中也在y中,並且他們在x y中滿足嚴格的下標為乙個增序列 假設下標從左到右依次增大 另外,不要求z...

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

給定兩個字串s1s2.sn和t1t2.tn。求出這兩個字串最長的公共子串行 輸入 abcicba abdkscab 輸出 abca 定義dp i j 為s1 si和t1 tj對應的lcs的長度 s1 si 1和t1 tj 1對應的公共子列有三種情況 當si 1 tj 1時,在s1 si和t1 tj的...

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

time limit 1000ms memory limit 65536kb problem description 給定兩個序列x input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文本母 a,z 表示序列x和y。output 每組輸出一行,表示所求得的最長公...