DP之序列 子串問題

2021-10-06 02:53:01 字數 1334 閱讀 8388

dp之序列、字串問題是非常常見的一種問題,它包括下面這些題型:

最大連續子串行和

最長不下降子串行(lis)

最大公共子串行

最長回文子串

這類問題的最大特點就是它的dp陣列的索引i是依據序列或字串的下標的。即根據序列seq[i]或者字串s[i]來定義dp[i]的含義,例如lisdp[i]的定義就是以當前seq[i]為末尾的最長不下降子串行。這裡的dp陣列的定義非常能體現劃零為整的思想。

在上面四類典型問題中:

最大連續子串行和和最長不下降子串行(lis)屬於序列問題。它們的dp陣列維度都是1維噠~

最大公共子串行和最長回文子串屬於字串子串問題。其中最大公共子串行的dp陣列是2維的,畢竟它涉及到了2個字串嘛~,而最長回文子串的dp陣列也是2維的,因為它需要兩個資訊,乙個是子串的start,乙個是子串的end

字串的子串必須是連續的,子串行可以是不連續的。

一定要特別注意dp問題的初始化,不同的題目往往初始化條件是不一樣的。例如:

需要將狀態轉移方程仔細理解清楚,一定要能夠用語言清晰的描述dp[i]或者dp[i][j]的含義,在書寫狀態轉移方程是要善於利用最優子結構的思想,化零為整。

建議將ans的求解不要放到dp陣列遞推裡面,而是單獨設定乙個迴圈遍歷(求解dp是乙個最優,求解ans是乙個最優,加起來就是兩個最優),這樣更加能夠梳理思路,讓**更具有模組性。

對於dp陣列和ans的資料型別,要考慮是否需要使用long long型別。使用long long型別的話要特別注意輸出得使用printf("%lld",value)

dp基礎之雙序列型子串出現次數

問題分析 可以用類似於最長公共子串的思路。問b在a中出現的次數,考慮最後乙個字元b n 1 和a m 1 case1 如果b n 1 a m 1 則考慮b 0,n 2 在a 0,m 2 出現多少次 case2 如果b n 1 a m 1 則考慮b 0,n 1 在a 0,m 2 出現多少次 子問題 原...

dp 最長公共子串行問題

最長公共子串行問題 time limit 1000 ms memory limit 65536 kib problem description 給定兩個序列 x 和 y 找出x和y的最長公共子串行。input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文本母 a,z...

最長公共子串行問題 DP

problem description 給定兩個序列 x 和 y 找出x和y的最長公共子串行。input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文本母 a,z 表示序列x和y。output 每組輸出一行,表示所求得的最長公共子串行的長度,若不存在公共子串行,則輸...