不同的子串行 動態規劃

2021-10-25 19:36:21 字數 943 閱讀 9828

題目鏈結

思路:

將兩個字串從右向左進行遍歷;

s[i] 表示s串中從下標 i 開始到末尾的字串;

t[j]表示t串中從下標 j 開始到末尾的字串。

例如 「rara」 與 「ra」

首先都是從末尾的a開始遍歷,

若此時 i = 0 ,j = 0,代表「rara「與」ra「匹配的情況,

且 『r』 = 』r』 ,匹配,那麼此時有兩種情況:

將「rara」中最前面的 『r』 考慮在內,那麼與「ra「中最前面的『r』 相抵消,只需要考慮」ara「中有多少個」a「即可,則 子串行個數= dp[ i + 1 ][ j + 1]

不將 」rara「 中最前面的『r』考慮在內,那麼則是」rar」 中「ra"的個數, 則子串行個數 = dp[ i + 1][ j ]

將此兩種情況相加,則得到了匹配時子串行個數

若不匹配,那麼直接等於上述的第二種情況即可。

狀態方程:

當s[i] = t[j]時,dp[i][j] = dp[i+1][j+1] + dp[i+1][j]

當s[i] = t[j]時,dp[i][j] = dp[i+1][j]

注意:

當 j = 字串長度時,此時 t[ j ] 代表空串,該空串為任意字串的子串行。

**:

public

intnumdistinct

(string s, string t)

for(

int i = s.

length()

-1; i >=

0; i--

)else}}

return dp[0]

[0];

}

最長不降子串行 動態規劃

2008 4 8 最長不降子串行 小明晚上回家後,和爸爸玩這樣的乙個遊戲 給出n個 0一 動態規劃演算法 本題是比較簡單的動態規劃,請理解好遞推的過程。具體方法是對於陣列a,另設一陣列b,將b陣列內元素全置1,表示最短子串行長度為1。從陣列a左到右乙個個判斷,每判斷乙個,則從這個元素向右尋找,找到比...

最長回文子串行 動態規劃

所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba c 對於乙個字串,可以通過刪除某些字元而變成回文字串,如 cabebaf 刪除 c e f 後剩下子串 abba 就是回文字串。要求,給定任意乙個字串,字串最大長度1000,計算出最長的回文子串行長度。如 cabebaf ...

最大上公升子串行(動態規劃)

最大上公升子串行 動態規劃 s 給定陣列,輸出陣列的最大上公升子串行。輸入 兩行測試資料 第一行代表陣列元素個數 第二行輸入陣列中的整數 輸出 輸出最大上公升子串行的長度 輸入樣例 81 3 4 2 7 9 6 8 輸出樣例 5 一和 二思路一樣,都是從陣列的第i 1 i n 位置開始尋找最大上公升...