題目鏈結
時間限制: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
aabb
aaaaabcaa
輸出
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];
**
#include
typedef long long ll;
using namespace std;
inline int read(
) while(ch>=
'0'&&ch<=
'9') s=s*10+ch-'0',ch=getchar(
);//s=
(s<<3)+(s<<1)+(ch^48)
;return s*w;
}const int maxn=60;
int dp[maxn]
[maxn]
[maxn]
[maxn]
;int main(
) if(dp[i]
[lena]
[j][lenb]
) mx=max(mx,tj+ti);}
}}} cout
[lena]
[j][lenb]
*/
另外
tj和tn從0開始,不斷討論a中i到i+tj和b中m到tn的回文字串
牛客網 每日一題 5月9日 過河
時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋...
牛客每日一題 合併回文子串(區間DP)
題目鏈結 題目描述 輸入兩個字串a和b,合併成乙個串c,屬於a和b的字元在c中順序保持不變。如 abc 和 xyz 可以被組合成 axbycz 或 abxcyz 等。我們定義字串的價值為其最長回文子串的長度 回文串表示從正反兩邊看完全一致的字串,如 aba 和 xyyx 需要求出所有可能的c中價值最...
牛客網 每日一題 5月20日題目 簡單瞎搞題
比賽鏈結 輸入描述 第一行乙個數 n。然後 n 行,每行兩個數表示 li,ri。輸出描述 輸出一行乙個數表示答案。示例1 輸入512 2334 4556 輸出 26備註 1 n li ri 100 xi的是在 li ri 中任選乙個,然後構成值,所以可以用分組揹包來做 dp i j 前i個數字能否構...