题目:
输入两个字符串A和B,合并成一个串C。问C的最长回文子串长度。
合并规则:属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被合并成"axbycz"或"abxcyz"等。
|A|、|B| ≤ 50
做法:
代码
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false), cin.tie(0)
#define debug(a) cout << #a ": " << a << endl
using namespace std;
typedef long long ll;
const int N = 55;
char s[N], p[N];
int dp[N][N][N][N];
int main(void){
IOS;
int T; cin >> T;
while (T--){
cin >> (s+1) >> (p+1);
int n = strlen(s+1), m = strlen(p+1);
int ans = 0;
for (int s_len = 0; s_len <= n; ++s_len){
for (int p_len = 0; p_len <= m; ++p_len){
for (int i = 1; i+s_len-1 <= n; ++i){
for (int k = 1; k+p_len-1 <= m; ++k){
int j = i+s_len-1, l = k+p_len-1;
if (s_len+p_len <= 1) dp[i][j][k][l] = 1;
else{
dp[i][j][k][l] = 0;
if (s[i] == s[j] && s_len) dp[i][j][k][l] |= dp[i+1][j-1][k][l];
if (p[k] == p[l] && p_len) dp[i][j][k][l] |= dp[i][j][k+1][l-1];
if (s[i] == p[l] && s_len && p_len) dp[i][j][k][l] |= dp[i+1][j][k][l-1];
if (p[k] == s[j] && s_len && p_len) dp[i][j][k][l] |= dp[i][j-1][k+1][l];
}
if (dp[i][j][k][l]) ans = max(ans, s_len+p_len);
}
}
}
}
cout << ans << endl;
}
return 0;
}
京公网安备 11010502036488号