• 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;
    }
  • 相关阅读:
    LAMP课程(3)
    LAMP课程
    vim文本编辑
    mysql常用语句
    mysql双机互相备份
    Java NIO
    适配器模式
    对象的序列化与反序列化
    字符流
    Java Socket
  • 原文地址:https://www.cnblogs.com/Draymonder/p/9879604.html
Copyright © 2020-2023  润新知