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]);
}
原文地址:https://www.cnblogs.com/MikuKnight/p/8676204.html