ACM 最長公共子串行 動態規劃求解

2021-06-27 01:34:45 字數 818 閱讀 6373

最長公共子串行問題:給你兩個字串a[m],b[n],求出他們的公共子字串的長度(子字串不需要再原字串中連續)。

這個問題的一般想法是:

1.找出a[m]中的每個子字串;

2.看其是否也能存在在b[n]中;

3.找出公共子字串中最大的乙個。

然而這個方法對於計算機來說實在是過於複雜,比較好的方法是使用動態規劃的方法:

首先這是乙個比較複雜的問題,我們需要將它分為一些簡單的小問題來解決,最常見的方式就是找到遞推規律,然後就能將乙個複雜的問題分成一步一步來解決。來看這個問題,我們需要找出這個問題的地推公式,研究我們若已近找到a[1,2.....i]與b[1,2,....j]的公共子串行的情況下,關於a[1,2,.....i+1],b[1,2,....j+1]的公共子串行的問題。設cs[k]=lcs(i,j)為a[1,2.....i],b[1,2,....j]的公共最長子序列,c(i,j)為其長度:

(1)若a[i]=b[j],則顯然c(i,j)=c(i-1,j-1)+1

(2)若a[i]!=b[j],則有三種情況需要考慮:

綜上所述,有c[i,j]=max,即求出了遞推公式。如果直接用遞迴可以看出,若a[i]!=b[j],每次遞迴都要呼叫兩次遞迴,計算的複雜度是程二叉樹增加的。而這些遞迴的問題很有可能是已經解決過了的,也就是存在重疊子問題的情況,如果可以避免重複計算這些問題,就可以大大減少計算量,因此我們可以將這些解決過的問題儲存起來,下次再碰到就不需要重新計算了。再來看這個問題的模型,我們可能碰到的子問題的形式都是c(x,y)的形式,x屬於[0,n],y屬於[0,m],因此我們可以建立乙個二維陣列來儲存,由遞推公式將二維陣列一步一步填滿,最後求出c(n,m)。

最長公共子串行 動態規劃

經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是動態規劃法所...

最長公共子串行 動態規劃

關於用動態規劃法求兩個序列的最長公共子串行問題的相關知識見 王曉東 計算機演算法設計與分析 第三章。注意,這裡所指的最長公共子串行是可以不相鄰的,與平常所說的最長公共子串 相鄰的 不一樣。直接上 lcs.h ifndef lcs h define lcs h class lcstring endif...

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

定義 乙個數列 如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 稱為已知序列的最長公共子串行。考慮最長公共子串行問題如何分解成子問題,設a a0,a1,am 1 b b0,b1,bm 1 並z z0,z1,zk 1 為它們的最長公共子串行。不難證明有以下性質 1 如果am ...