nowcoder 合并回文子串
链接:https://www.nowcoder.com/acm/contest/6/C
来源:牛客网
题目
输入两个字符串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的价值。
Input
2 aa bb a aaaabcaa
Output
4 5
#include <bits/stdc++.h> using namespace std; const int N = 55; const int INF = 0x3f3f3f3f; char a[N], b[N]; int dp[N][N][N][N]; int main () { int T; scanf("%d", &T); while(T--) { memset(dp,0,sizeof(dp)); scanf("%s%s", a+1, b+1); int l1 = strlen(a+1), l2 = strlen(b+1); int ans = 0; for(int len1=0; len1 <= l1; len1++) { for(int len2=0; len2 <= l2; len2++) { for(int i=1, j=i+len1-1;j <= l1; i++,j++) { for(int k=1,l=k+len2-1; l <= l2; k++,l++) { if(len1 == 0 && len2 == 0) dp[i][j][k][l] = 0; else if((len1 == 0 && len2 == 1) || (len1 == 1 && len2 == 0)) dp[i][j][k][l] = 1; else { dp[i][j][k][l] = -INF; if(i<j && a[i] == a[j]) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i+1][j-1][k][l] + 2); if(k<l && b[k] == b[l]) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k+1][l-1] + 2); if(i<=j && k<=l && a[i]== b[l]) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i+1][j][k][l-1]+2); if(i<=j && k<=l && a[j] == b[k]) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j-1][k+1][l]+2); ans = max(ans, dp[i][j][k][l]); } } } } } printf("%d\n", ans); } return 0; }