关闭

[CodeM初赛A轮]B

183人阅读 评论(1) 收藏 举报
分类:

题解

设dp f[i1,i2,j1,j2]表示选出A串的[i1,i2]以及B串的[j1,j2]能否组成回文串。
dp转移显然。
但是边界比较麻烦。
考虑先做dp fa[i,j]和fb[i,j]分表表示A串的[i,j]和B串的[i,j]是不是回文串,然后瞎枚举弄出一些f的初值。
回文串完全在一个串中也要判断。
有点坑QAQ
详见代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
const int maxn=50+10,inf=100000000;
char a[maxn],b[maxn];
int fa[maxn][maxn],fb[maxn][maxn],f[maxn][maxn][maxn][maxn];
int i,j,i1,i2,jj1,j2,k,l,t,n,m,ca,ans;
int main(){
    scanf("%d",&ca);
    while (ca--){
        scanf("%s",a+1);
        scanf("%s",b+1);
        n=strlen(a+1);m=strlen(b+1);
        fo(i,0,n)
            fo(j,0,n)
                fa[i][j]=-inf;
        fo(i,0,m)
            fo(j,0,m)
                fb[i][j]=-inf;
        fo(i1,0,n)
            fo(i2,0,n)
                fo(jj1,0,m)
                    fo(j2,0,m)
                        f[i1][i2][jj1][j2]=-inf;
        fo(i,1,n)
            fo(j,1,m)
                if (a[i]==b[j]) f[i][i][j][j]=2;
        ans=0;
        fo(i,1,n) fa[i][i]=1;
        fo(i,1,n-1) 
            if (a[i]==a[i+1]) fa[i][i+1]=2;
        fd(i,n,1)
            fo(j,1,n)
                if (fa[i][j]!=-inf){
                    t=fa[i][j];
                    ans=max(ans,t);
                    if (i>1&&j<n&&a[i-1]==a[j+1]) fa[i-1][j+1]=t+2;
                    fo(k,1,m){
                        if (j<n&&b[k]==a[j+1]) f[i][j+1][k][k]=t+2;
                        if (i>1&&b[k]==a[i-1]) f[i-1][j][k][k]=t+2;
                        if (k<m&&b[k]==b[k+1]) f[i][j][k][k+1]=t+2;
                    }
                }
        fo(i,1,m) fb[i][i]=1;
        fo(i,1,m-1) 
            if (b[i]==b[i+1]) fb[i][i+1]=2;
        fd(i,m,1)
            fo(j,1,m)
                if (fb[i][j]!=-inf){
                    t=fb[i][j];
                    ans=max(ans,t);
                    if (i>1&&j<m&&b[i-1]==b[j+1]) fb[i-1][j+1]=t+2;
                    fo(k,1,n){
                        if (j<m&&a[k]==b[j+1]) f[k][k][i][j+1]=t+2;
                        if (i>1&&a[k]==b[i-1]) f[k][k][i-1][j]=t+2;
                        if (k<n&&a[k]==a[k+1]) f[k][k+1][i][j]=t+2;
                    }
                }
        fd(i1,n,1)
            fo(i2,1,n)
                fd(jj1,m,1)
                    fo(j2,1,m)
                        if (f[i1][i2][jj1][j2]!=-inf){
                            t=f[i1][i2][jj1][j2];
                            ans=max(ans,t);
                            if (ans==6){
                                t=t;
                            }
                            if (i1>1&&i2<n&&a[i1-1]==a[i2+1]) f[i1-1][i2+1][jj1][j2]=t+2;
                            if (jj1>1&&j2<m&&b[jj1-1]==b[j2+1]) f[i1][i2][jj1-1][j2+1]=t+2;
                            if (i1>1&&j2<m&&a[i1-1]==b[j2+1]) f[i1-1][i2][jj1][j2+1]=t+2;
                            if (i2<n&&jj1>1&&b[jj1-1]==a[i2+1]) f[i1][i2+1][jj1-1][j2]=t+2;
                        }
        printf("%d\n",ans);
    }
}
0
0

猜你在找
深度学习基础与TensorFlow实践
【在线峰会】前端开发重点难点技术剖析与创新实践
【在线峰会】一天掌握物联网全栈开发之道
【在线峰会】如何高质高效的进行Android技术开发
机器学习40天精英计划
Python数据挖掘与分析速成班
微信小程序开发实战
JFinal极速开发企业实战
备战2017软考 系统集成项目管理工程师 学习套餐
Python大型网络爬虫项目开发实战(全套)
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:163830次
    • 积分:8221
    • 等级:
    • 排名:第2254名
    • 原创:640篇
    • 转载:5篇
    • 译文:0篇
    • 评论:159条
    公告
    幻梦终醒,本无不散之宴,却不悔付此华年。
    最新评论
    文章分类