• BZOJ4313 : 三维积木


    不妨设$R$是唯一可以看到的颜色,考虑一维序列的情况。

    设$f[i][j][k][x][y]$表示考虑了前$i$个位置,第$i$个位置的高度是$j$,最高高度是$k$,已经用了$x$个$R$,$y$个非$R$的方案数,转移则是要么使自己的高度$+1$,要么考虑下一个位置。

    由此可以在$O(n^5)$的时间内预处理出$g[i][j]$,表示一行用了$i$个$R$,$j$个非$R$的方案数。

    对于二维的情况,设$dp[i][j][k]$表示考虑了前$i$行,用了$j$个$R$,$k$个非$R$的方案数,枚举下一行转移即可。

    对于$R$是唯一可以看到的颜色的情况,$ans=dp[n][R][G+B]C(G+B,G)$。

    时间复杂度$O(n^5)$。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=27,P=1000000007;
    int R,G,B,n,m,o,i,j,k,x,y,C[N*2][N*2],f[2][N][N][N][N*2],g[N][N*2],dp[N][N][N*2],ans;
    inline void up(int&a,int b){a+=b;if(a>=P)a-=P;}
    int cal(int R,int G,int B){return 1LL*dp[n][R][G+B]*C[G+B][G]%P;}
    int main(){
      scanf("%d%d%d%d",&R,&G,&B,&n);
      m=max(R,max(G,B));
      f[0][0][0][0][0]=1;
      for(i=0;i<n;i++,o^=1){
        for(j=0;j<=m;j++)for(k=j;k<=m;k++)for(x=k;x<=m;x++)for(y=0;y<=m*2;y++)f[o^1][j][k][x][y]=0;
        for(j=0;j<=m;j++)for(k=j;k<=m;k++)for(x=k;x<=m;x++)for(y=0;y<=m*2;y++)if(f[o][j][k][x][y]){
          up(f[o^1][0][k][x][y],f[o][j][k][x][y]);
          if(j==k)up(f[o][j+1][k+1][x+1][y],f[o][j][k][x][y]);
          else{
            up(f[o][j+1][k][x+1][y],f[o][j][k][x][y]);
            up(f[o][j+1][k][x][y+1],f[o][j][k][x][y]);
          }
        }
      }
      for(k=0;k<=m;k++)for(x=k;x<=m;x++)for(y=0;y<=m*2;y++)if(f[o][0][k][x][y])up(g[x][y],f[o][0][k][x][y]);
      for(C[0][0]=i=1;i<=m*2;i++)for(C[i][0]=j=1;j<=i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%P;
      dp[0][0][0]=1;
      for(i=0;i<n;i++)for(j=0;j<=m;j++)for(k=0;k<=m*2;k++)if(dp[i][j][k])
        for(x=0;j+x<=m;x++)for(y=0;y+k<=m*2;y++)
          up(dp[i+1][j+x][y+k],1LL*dp[i][j][k]*g[x][y]%P);
      ans=cal(R,G,B);
      up(ans,cal(G,R,B));
      up(ans,cal(B,R,G));
      return printf("%d",ans),0;
    }
    

      

  • 相关阅读:
    Asp.Net+Oracle+BootStrap+Jquery
    UML类图几种关系的总结
    PHP对象在内存堆栈中的分配
    php sprintf 详解
    微信错误代码45047:客服消息只能发送20条/个用户
    php利用array_search与array_column实现二维数组查找
    mvc 详解
    php中++i 与 i++ 的区分详解
    Git 别名多个命令 超实用
    php 对象继承
  • 原文地址:https://www.cnblogs.com/clrs97/p/6359992.html
Copyright © 2020-2023  润新知