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
", ans);
    }   
    return 0;
}
原文地址:https://www.cnblogs.com/Draymonder/p/9879604.html