首页 > 其他 > 详细

bzoj1566

时间:2018-03-30 15:05:44      阅读:182      评论:0      收藏:0      [点我收藏+]

动态规划,挺经典的

两次取的序列一样,可以看成两个人分别玩一次,然后两个人得到的序列一样.

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]);
}

 

bzoj1566

原文:https://www.cnblogs.com/MikuKnight/p/8676204.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!