美团A轮 合并回文子串 【dp】

来源:互联网 发布:win10风扇控制软件 编辑:程序博客网 时间:2024/06/07 05:59
 合并回文子串时间限制:2秒空间限制:262144K输入两个字符串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的价值。输入例子:2aabbaaaaabcaa输出例子:45

考虑a[i...j]和b[k...l]组成的合并成回文串的情况
如果a[i]==b[l] && a[i+1...j]和b[k...l-1]能组成回文子串
a[i...j]和b[k...l]也能组成回文串

如果a[i]==a[j]&&i<j&&a[i+1...j-1]和b[k...l]能组成回文串
a[i...j]和b[k...l]也能组成回文串

如此类推,转移方程懒得写了…
ans=max(j-i+1+l-k+1) |  a[i..j]和b[k...l]能组成回文串

#include <stdio.h>#include <bits/stdc++.h>#define ll long long#define pii pair<int,int>#define MEM(a,x) memset(a,x,sizeof(a))using namespace std;const int inf=1e9+7;const double EPS=1e-7;const int N = 200+5;char a[100],b[100];bool d[55][55][55][55];int dp(int na,int nb){    int ans=0;    for(int i=na;i>=0;--i){        for(int j=i;j<=na;++j){            for(int k=nb;k>=0;--k){                for(int l=k;l<=nb;++l){                    bool&res=d[i][j][k][l];                    res=0;                    if(                            (i==j&&k+1==l)||                            (i+1==j&&k==l)||                            (i==j&&k==l)                            ){                        res=1;                    }                    if(i!=j&&k!=l){                        if(a[i]==b[l-1]&&d[i+1][j][k][l-1]){                            res=1;                        }                        if(a[j-1]==b[k]&&d[i][j-1][k+1][l]){                            res=1;                        }                    }                    if(i<j-1&&a[i]==a[j-1]&&d[i+1][j-1][k][l]){                        res=1;                    }                    if(k<l-1&&b[k]==b[l-1]&&d[i][j][k+1][l-1]){                        res=1;                    }                    if(res){                        ans=max(ans,j-i+l-k);                    }                }            }        }    }    return ans;}int slove(){    int na=strlen(a),nb=strlen(b);    MEM(d,0);    return dp(na,nb);}int main(){    //freopen("/home/lu/code/r.txt","r",stdin);    //freopen("/home/lu/code/w.txt","w",stdout);    int T;    scanf("%d",&T);    while(T--){        scanf("%s%s",a,b);        printf("%d\n",slove());    }    return 0;}
阅读全文
0 0
原创粉丝点击