牛客網 每日一題 3月26日 合併回文子串

2021-10-04 09:58:40 字數 1803 閱讀 7590

題目鏈結

時間限制: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個數字能否構...