動態規劃 合併回文字串

2022-06-26 23:42:14 字數 1217 閱讀 7597

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

2

aabb

aaaaabcaa

4

5

本題採用區間dp。

給出轉移方程:

設dp[i][j][k][l] 若a[i-1]到a[j-1] 和 b[k-1]到b[l-1] 所組成的字串是回文則其值為1,否則為2。

dp[i][j][k][l]=dp[i+1][j-1][k][l] (a[i]a[j] && ib[l] && kb[l] && i<=j && k<=l)

dp[i][j][k][l]=dp[i][j-1][k+1][l] (a[j]b[k] && i<=j && k<=l)

初始化:

單獨乙個字元顯然的回文的,沒有字元我們也認為它是回文的(結合轉移方程)。

因此,區間長度分別設為l1,l2。初始化的條件顯然 l1+l2<=1 則dp=1

另外:注意for迴圈的設定。

本題中的判斷為幾個並列的if,因此採用了同或,任一條件觸發1,即為1。

#include #include #include using namespace std;

#define maxn 52

int dp[maxn][maxn][maxn][maxn];

int main()

else

}if (dp[i][j][k][l])

max = max > l1 + l2 ? max : l1 + l2;}}

}}

cout << max << endl;

}return 0;

}

合併回文子串

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

合併回文子串

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

動態規劃 最長回文字串

題目 請從乙個已知的字串中尋找最長回文字串 解法1 動態規劃 回文字串的子串也是回文,比如p i,j 表示以i開始以j結束的子串 是回文字串,那麼p i 1,j 1 也是回文字串。這樣最長回文子串就能分解成一系列子問題了。這樣需要額外的空間o n 2 演算法複雜度也是o n 2 狀態方程和轉移方程 ...