美團A輪 合併回文子串 dp

2021-08-02 20:43:48 字數 1384 閱讀 3360

合併回文子串

時間限制:2秒

空間限制:262144k

輸入兩個字串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的價值。

輸入例子:2aa

bbaaaaabcaa

輸出例子:

45

考慮a[i...j]和b[k...l]組成的合併成回文串的情況

如果a[i]==b[l] && a[i+1...j]和b[k...l-1]能組成回文子串

a[i...j]和b[k...l]也能組成回文串

如果a[i]==a[j]&&i如此類推,轉移方程懶得寫了…

ans=max(j-i+1+l-k+1) |  a[i..j]和b[k...l]能組成回文串

#include 

#include

#define ll long long

#define pii pair

#define mem(a,x) memset(a,x,sizeof(a))

using

namespace

std;

const

int inf=1e9+7;

const

double eps=1e-7;

const

int n = 200+5;

char a[100],b[100];

bool d[55][55][55][55];

int dp(int na,int nb)

if(i!=j&&k!=l)

if(a[j-1]==b[k]&&d[i][j-1][k+1][l])

}if(i1&&a[i]==a[j-1]&&d[i+1][j-1][k][l])

if(k1&&b[k]==b[l-1]&&d[i][j][k+1][l-1])

if(res)}}

}}

return ans;

}int slove()

int main()

return

0;}

CodeM美團初賽A輪 合併回文子串 dp

傳送門 輸入例子 2 aabb aaaaabcaa 輸出例子 4 5題解 dp,i代表a串開始的位置,j代表b串開始的位置,da,db分別代表在a和b中的長度,dp x y z h 代表 a中選下標為x到y 1的串 和 b中選z到h 1的串是否可以組合成回文串。利用每個字串的長度更新dp i i d...

合併回文子串 區間dp

題目描述 輸入兩個字串a和b,合併成乙個串c,屬於a和b的字元在c中順序保持不變。如 abc 和 xyz 可以被組合成 axbycz 或 abxcyz 等。我們定義字串的價值為其最長回文子串的長度 回文串表示從正反兩邊看完全一致的字串,如 aba 和 xyyx 需要求出所有可能的c中價值最大的字串,...

區間dp 合併回文子串

dp i j k p 表示a串的 i,j 和b串的 k,p 能否通過交叉且保持原有順序不變形成回文串。4維dp,先列舉長度,再列舉位置,狀態合法則貢獻答案。include using namespace std typedef long long ll 三年競賽一場空,不開long long見祖宗 ...