[CodeM初赛A轮]B
来源:互联网 发布:功夫软件 编辑:程序博客网 时间:2024/05/21 00:52
题解
设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
- [CodeM初赛A轮]B
- codeM初赛B轮A题
- [CodeM初赛A轮]A
- [CodeM初赛A轮]C
- [CodeM初赛A轮]D
- [CodeM初赛A轮]E
- codeM 初赛b轮 子串
- CodeM美团点评编程大赛初赛A轮 B.合并回文子串【区间Dp】
- CodeM美团点评编程大赛初赛B轮 A.黑白树【树型Dp】
- CodeM美团 初赛A轮 A题 身体训练
- CodeM美团点评编程大赛初赛B轮
- CodeM美团点评编程大赛初赛B轮题解
- CodeM美团点评编程大赛 初赛B轮 A 黑白树 贪心 E 子串 暴力
- CodeM美团 初赛A轮 C题 倒水
- 美团CodeM 初赛 A轮 数列互质 莫队
- CodeM美团点评编程大赛初赛A轮
- CodeM美团点评编程大赛初赛B轮 B.送外卖2【三进制状压Dp】
- CodeM美团点评编程大赛初赛B轮 B.送外卖2 三进制状压DP
- filter()
- 实训总结
- react 生命周期流程图
- java调soap接口
- java spring为ApplicationContext提供有三种实现(dubbo-consumer.xml)
- [CodeM初赛A轮]B
- ORA-12560: TNS:protocol adapter error
- 进制转换——除r取余法
- 字符串处理函数
- QPSK调制的C实现
- EJB学习笔记-3-javaclient访问EJB(remote)
- Android沉浸式状态栏(透明状态栏)
- spring加载本地xsd
- iOS开发:沙盒机制以及利用沙盒存储字符串、数组、字典等数据