牛客网【每日一题】3月26日 合并回文子串
題號:NC13230
名稱:合并回文子串
來源:美團2017年CodeM大賽-初賽A輪
題目鏈接
時間限制:C/C++ 2秒,其他語言4秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format:
%lld
題目描述
輸入兩個字符串A和B,合并成一個串C,屬于A和B的字符在C中順序保持不變。如"abc"和"xyz"可以被組合成"axbycz"或"abxcyz"等。
我們定義字符串的價值為其最長回文子串的長度(回文串表示從正反兩邊看完全一致的字符串,如"aba"和"xyyx")。
需要求出所有可能的C中價值最大的字符串,輸出這個最大價值即可 輸入描述:
第一行一個整數T(T ≤ 50)。 接下來2T行,每兩行兩個字符串分別代表A,B(|A|,|B| ≤ 50),A,B的字符集為全體小寫字母。
輸出描述:
對于每組數據輸出一行一個整數表示價值最大的C的價值。
示例1
輸入
2 aa bb a aaaabcaa輸出
4 5思路:區間dp問題
dp[i][j][m][n]表示A中下標i到j-1以及B中下標m到n-1的串,能否組成回文串
(dp值為零則表示不構成回文串,不為零則表示構成)
首先:字符本身是回文串
其次,分為四種情況
a[i]==a[j-1] dp[i][j][m][n]+=c[i+1][j-1][m][n];
因為dp我們只考慮是否為0或非0,所以dp之間可以+=也可以|=,都不影響
(當A的第i為和第j-1位相同時,那么dp[i][j]是否為回文串就取決于比它小一層的dp[i+1][j-1],這樣一次往里推,就可以推到以一種情況)
b[m]==b[n-1] dp[i][j][m][n]+=c[i][j][m+1][n-1];
(和上一個思路相同)
a[i]==b[n-1] dp[i][j][m][n]+=c[i+1][j][m][n-1];
(當A的i與B的n-1相同時,那么dp[i][][][n]是否為回文串就取決于A的后一位i+1和B的前一位n-1的情況)
a[m]==b[j-1] dp[i][j][m][n]+=c[i][j-1][m+1][n];
代碼
另外
tj和tn從0開始,不斷討論A中i到i+tj和B中m到tn的回文字符串
總結
以上是生活随笔為你收集整理的牛客网【每日一题】3月26日 合并回文子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓窗口化软件(安卓窗口化)
- 下一篇: 万网的域名怎么解析(万网的域名怎么解析的