牛客每日一題 合併回文子串(區間DP)

2021-10-05 14:01:43 字數 994 閱讀 5484

題目鏈結

題目描述

輸入兩個字串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輸入2aa

bbaaaaabcaa輸出4

5思路:具體細節很多大佬寫的都很清楚,不了解的話可以去牛客官網找找大佬們的題解,這裡就寫一下自己的所獲所得,由於l和r兩端無法確定是否能取,這裡有個巧妙地設為設dp【l】【r】【x】【y】代表a字串的【l,r】子串和b字串的【x,y】子串是否能構成回文,dp【x】【y】【l】【r】和dp【l】【r】【x】【y】的道理其實是一樣的,但感覺自己就是很難想到這一步,有的時候還是卡在狀態的定義上,不知道什麼狀態能不能轉移,可能骨子裡對動態規劃還是不是很能理解。。。

#include

using

namespace std;

const

int maxn=55;

int t,dp[maxn]

[maxn]

[maxn]

[maxn]

;char a[maxn]

,b[maxn]

;int

main()

if(dp[l]

[r][x]

[y]) ans=

max(ans,len1+len2);}

printf

("%d\n"

,ans);}

}

牛客每日一題3 26 合併回文子串 動態規劃

首先這種題肯定是動態規劃!不要往其他地方想。要怎麼做呢先從單個串要怎麼判斷區間最長回文來說。單個串如果要判斷任意乙個區間 l,r 是不是回文可以去寫區間dp,對於乙個串長度大於2的回文串,如果要在此基礎上在延長串的長度必然是在頭尾加兩個,所以對於乙個串的就可以寫出方程 f l r f l 1 r 1...

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

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

合併回文子串 區間dp

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