有两个栈,每个栈从底向上有一些颜色为A或B的球,现将这些球全部取出,假设能得到
求
这里需要巧妙转化
那么设
滚动数组优化第一维,直接
可能还有更优秀的方法。。
#include<bits/stdc++.h>
#define LL long long
#define clr(x,i) memset(x,i,sizeof(x))
using namespace std;
const int N=503,mo=1024523;
char s1[N],s2[N];
int n,m,f[3][N][N];
inline void add(int &x,int y)
{
x+=y;
if(x>mo)x-=mo;
}
int main()
{
scanf("%d%d%s%s",&n,&m,s1+1,s2+1);
int now=0;
f[now][0][0]=1;
for(int i=0;i<=n;i++)
{
clr(f[now^1],0);
for(int j=0;j<=m;j++)
{
int mk=min(i+j,n);
for(int k=0;k<=mk;k++)
{
int l=i+j-k,v=f[now][j][k];
if(s1[i+1]==s1[k+1])add(f[now^1][j][k+1],v);
if(s1[i+1]==s2[l+1])add(f[now^1][j][k],v);
if(s2[j+1]==s1[k+1])add(f[now][j+1][k+1],v);
if(s2[j+1]==s2[l+1])add(f[now][j+1][k],v);
}
}
now^=1;
}
printf("%d",f[now][m][n]);
return 0;
}