bzoj1566
动态规划,挺经典的
两次取的序列一样,可以看成两个人分别玩一次,然后两个人得到的序列一样.
f [ i ][ j ][ k ]表示已经用了 i 个球,,第一个人在上方取了j个,第二个人在上方取了k个的答案.
#include<cstdio> #define mo 1024523 using namespace std; int n,m,f[2][505][505]; char s1[505],s2[505]; int main(){ scanf("%d%d",&n,&m); scanf(" %s %s",s1+1,s2+1); f[0][0][0]=1; for(int i=0;i<m+n;i++){ int t=i%2; for(int j=0;j<=n&&j<=i;j++) for(int k=0;k<=n&&j<=i;k++) if(f[t][j][k]){ if(s1[j+1]==s2[i-k+1]) (f[!t][j+1][k]+=f[t][j][k])%=mo; if(s2[i-j+1]==s1[k+1]) (f[!t][j][k+1]+=f[t][j][k])%=mo; if(s2[i-j+1]==s2[i-k+1]) (f[!t][j][k]+=f[t][j][k])%=mo; if(s1[j+1]==s1[k+1]) (f[!t][j+1][k+1]+=f[t][j][k])%=mo; f[t][j][k]=0; } } printf("%d\n",f[(n+m)%2][n][n]); }