合併回文子串 區間dp

2021-10-06 06:31:35 字數 1414 閱讀 2482

題目描述

輸入兩個字串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][k][p]表示的是選擇字串a第i到j,字串b第k到p的串。我們來思考下狀態轉移方程!

當a[i]==a[j]的時候,這個時候,最長的回文串是什麼?毫無疑問,將a[i]與a[j]拼接到串a[i+1][j-1][k][p]當中即可。

當a[i]==b[p],b[k]==a[j],b[k]==b[p]都是如此。

注意寫區間dp要從小區間更新大區間,那怎麼做呢?列舉區間長度即可!(邊界處理有點難)

#include

#include

#define mmax 55

using

namespace std;

int dp[55]

[55][

55][55

];int main (

)for

(int p=

0;p<=len2;p++

)int x=k,y=p;

if(i+j<=1)

else

if(x+

1<=xend&&y<=yend-

1&&a[x]

==b[yend-1]

)if(x<=xend-

1&&y+

1<=yend&&b[y]

==a[xend-1]

)if(y<=yend-

2&&b[y]

==b[yend-1]

)}if(dp[x]

[xend]

[y][yend]

) inf=

max(inf,i+j)

;// printf("%d %d %d %d %d\n",x,xend,y,yend,dp[x][xend][y][yend]);}}

}}cout<}return0;

}

區間dp 合併回文子串

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

NC13230 合併回文子串(區間dp)

從資料範圍不難推出可以用f,表示由兩個字串來表示的最長大小 並且因為是回文串,所以我們要向頭尾加字元,來變大,因為這個是回文子串,也就是連續的一段。include include include include include using namespace std const int n 55 c...

合併回文子串

學習周記 時間限制 c c 2秒,其他語言4秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 輸入兩個字串a和b,合併成乙個串c,屬於a和b的字元在c中順序保持不變。如 abc 和 xyz 可以被組合成 axbycz 或 abxcyz 等...