zoukankan      html  css  js  c++  java
  • [BZOJ1566][NOI2009]管道取珠(DP)

    1566: [NOI2009]管道取珠

    Time Limit: 20 Sec  Memory Limit: 512 MB
    Submit: 2187  Solved: 1273
    [Submit][Status][Discuss]

    Description

    Input

    第一行包含两个整数n, m,分别表示上下两个管道中球的数目。 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型。其中A表示浅色球,B表示深色球。 第三行为一个AB字符串,长度为m,表示下管道中的情形。

    Output

    仅包含一行,即为 Sigma(Ai^2) i从1到k 除以1024523的余数。

    Sample Input

    2 1
    AB
    B

    Sample Output

    5

    HINT

    样例即为文中(图3)。共有两种不同的输出序列形式,序列BAB有1种产生方式,而序列BBA有2种产生方式,因此答案为5。 【大致数据规模】 约30%的数据满足 n, m ≤ 12; 约100%的数据满足n, m ≤ 500。

    Source

    [Submit][Status][Discuss]

    平方不是随便给的。相当于A玩一次,B玩一次,最后结果相同的方案数。

    类似二取方格数了,f[x1][y1][x2][y2]表示A上面取了x1个,下面x2个,B上面x2个,下面y2个,最后结果相同的方案数。

    因为x1+y1=x2+y2,改成f[i][j][k]表示没人取了i个,A上面取了j个,B上面取了k个的方案数。

    滚动再压掉一维。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
     4 using namespace std;
     5 
     6 const int N=510,mod=1024523;
     7 int f[2][N][N],n,u,v,a[N],b[N],m;
     8 char s1[N],s2[N];
     9 
    10 int main(){
    11     freopen("bzoj1566.in","r",stdin);
    12     freopen("bzoj1566.out","w",stdout);        
    13     scanf("%d%d",&n,&m);
    14     scanf("%s",s1+1); scanf("%s",s2+1);
    15     rep(i,1,n) a[n-i+1]=s1[i]-'A';
    16     rep(i,1,m) b[m-i+1]=s2[i]-'A';
    17     f[0][0][0]=1;
    18     for (int i=0; i<n+m; i++){
    19         u=i&1,v=u^1;
    20         for (int j=0; j<=n && j<=i; j++)
    21             for (int k=0; k<=n && j<=i; k++)
    22                 if (f[u][j][k]){
    23                     if (a[j+1]==a[k+1]) f[v][j+1][k+1]=(f[v][j+1][k+1]+f[u][j][k])%mod;
    24                     if (a[j+1]==b[i-k+1]) f[v][j+1][k]=(f[v][j+1][k]+f[u][j][k])%mod;
    25                     if (b[i-j+1]==a[k+1]) f[v][j][k+1]=(f[v][j][k+1]+f[u][j][k])%mod;
    26                     if (b[i-j+1]==b[i-k+1]) f[v][j][k]=(f[v][j][k]+f[u][j][k])%mod;
    27                     f[u][j][k]=0;
    28                 }
    29     }
    30     printf("%d
    ",f[v][n][n]);
    31     return 0;
    32 }
  • 相关阅读:
    借鉴文章记录
    三方框架
    常用第三方库记录
    ios block 类型
    ios runtime部分事例方法说明
    ios url网址相关问题解说
    mysql迁移数据库函数中的坑
    mysql的事务隔离级别
    MySQL数据库的默认隔离级别为什么是可重复读
    实时查看mysql连接数
  • 原文地址:https://www.cnblogs.com/HocRiser/p/8808568.html
Copyright © 2011-2022 走看看