js演算法 動態規劃 最大公共子串與最大子段和

2021-07-04 21:57:50 字數 1592 閱讀 8848

最大公共子串**:

問題定義:比如輸入兩個字串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;當i0時,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)。對於j0也是一樣的,同樣可得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...