dp之序列、字串問題是非常常見的一種問題,它包括下面這些題型:
最大連續子串行和
最長不下降子串行(lis)
最大公共子串行
最長回文子串
這類問題的最大特點就是它的dp
陣列的索引i
是依據序列或字串的下標的。即根據序列seq[i]
或者字串s[i]
來定義dp[i]
的含義,例如lis
的dp[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 每組輸出一行,表示所求得的最長公共子串行的長度,若不存在公共子串行,則輸...