最大公共子串**:
問題定義:比如輸入兩個字串bdcaba和abcbdab的最長公共字串有bd和ab,它們的長度都是2
動態規劃思路:假設兩個字串分別為s和t,s[i]
和t[j]
分別表示其第i
和第j
個字元(字元順序從0
開始),再令l[i, j]
表示以s[i]
和t[j]
為結尾的相同子串的最大長度。應該不難遞推出l[i, j]
和l[i+1,j+1]
之間的關係,因為兩者其實只差s[i+1]
和t[j+1]
這一對字元。若s[i+1]
和t[j+1]
不同,那麼l[i+1, j+1]
自然應該是0
,因為任何以它們為結尾的子串都不可能完全相同;而如果s[i+1]
和t[j+1]
相同,那麼就只要在以s[i]
和t[j]
結尾的最長相同子串之後分別添上這兩個字元即可,這樣就可以讓長度增加一位。合併上述兩種情況,也就得到l[i+1,j+1]=(s[i]==t[j]?l[i,j]+1:0)
這樣的關係。
最後就是要小心的就是臨界位置:如若兩個字串中任何乙個是空串,那麼最長公共子串的長度只能是0
;當i
為0
時,l[0,j]
應該是等於l[-1,j-1]
再加上s[0]
和t[j]
提供的值,但l[-1,j-1]
本是無效,但可以視s[-1]
是空字元也就變成了前面一種臨界情況,這樣就可知l[-1,j-1]==0
,所以l[0,j]=(s[0]==t[j]?1:0)
。對於j
為0
也是一樣的,同樣可得l[i,0]=(s[i]==t[0]?1:0)
最大子段和:
問題定義:
對於給定序列a1,a
2,a3……a
n,尋找它的某個連續子段,使得其和最大。如( -2,11,-4,13,-5,-2 )最大子段是其和為20。
動態規劃演算法求解:
演算法思路如下:
記
由b[j]的定義知,當b[j-1]>0時,b[j]=b[j-1]+a[j],否則b[j]=a[j]。由此可得b[j]的動態規劃遞推式如下:
b[j]=max,1<=j<=n。
動態規劃解最大公共子串
子串是連續的 一 刻畫最優解結構特徵 用c i,j 表示以a i b j 結尾的最大公共子串中的字元數。則max c i,j 0 i len a 1,0 j len b 1 表示a和b最大公共子串的字元數。同時在求解過程中可以確定i和j,這樣也就確定了這個公共子串。二 遞迴定義最優解的值 c i,j...
1 8 動態規劃之最大公共子串問題。
給定兩個字串,str1 str2,求返回倆字串最長公共子串。分析 1 本題與求最長公共子串行相似,但又有所不同。在求子序列問題中,動態規劃通式i j位置的值取決於三個位置,dp i 1 j 1 dp i 1 j dp i j 1 三者中,2 先假設最後乙個字元相等,納入最長子序列中,那麼如果只改變乙...
最大公共子串行,最大公共子串,最大回文子串
1 兩個字串中最長公共子串行 該問題是動態規劃的經典問題,找出的公共序列不一定是連續的,參考資料很多,這裡就貼出公式和 做個簡單的筆記。設序列a,b的長度分別為n和m,l i,j 為a i b j 的最長公共子串行長度,有遞推公式 時間複雜度為o mn 如下 define n 50 intlcs c...