不妨设$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;
}

  

BZOJ4313 : 三维积木的更多相关文章

  1. 深度优先搜索(DFS)递归形式改为非递归形式

    DFS将递归改为非递归这个方法的需求来自于一道三维积木组合的题目,还在苦苦调试中,暂且不提. 普通的认识对于递归向非递归的转化无非是使用栈,但是结合到深度搜索如何将栈很好利用,如何很好保存现场,都不是 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. BZOJ 1109: [POI2007]堆积木Klo

    1109: [POI2007]堆积木Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 948  Solved: 341[Submit][Statu ...

  4. 1109: [POI2007]堆积木Klo

    1109: [POI2007]堆积木Klo https://lydsy.com/JudgeOnline/problem.php?id=1109 分析: 首先是dp,f[i]表示到第i个的最优值,f[i ...

  5. Problem E: 积木积水 ——————【模拟】

    Problem E: 积木积水 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元 ...

  6. 【BZOJ1109】[POI2007]堆积木Klo 二维偏序

    [BZOJ1109][POI2007]堆积木Klo Description Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔 ...

  7. 广东工业大学2016校赛决赛重现——E积木积水(方法据说很多)

    Problem E: 积木积水 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元 ...

  8. 【bzoj1109】[POI2007]堆积木Klo 动态规划+树状数组

    题目描述 Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔.妈妈告诉Mary游戏的目的是建一个塔,使得最多的积木在正确的位置 ...

  9. GDUT 积木积水 2*n 时间复杂度

    题意 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元,于是他把这个三维的现实问 ...

随机推荐

  1. OA协同办公软件

    OA协同办公软件: 泛微软件. 九思软件. 华天动力. 万户OA.:北京万户网络技术有限公司创立于1998年2月,是北京华宇软件股份有限公司(股票简称:“华宇软件”,股票代码:300271)的全资子公 ...

  2. ES系列十三、Elasticsearch Suggester API(自动补全)

    1.概念 1.补全api主要分为四类 Term Suggester(纠错补全,输入错误的情况下补全正确的单词) Phrase Suggester(自动补全短语,输入一个单词补全整个短语) Comple ...

  3. JS禁止鼠标右键、禁止全选、复制、粘贴的方法(所谓的防盗功能)

    简述:一个防君子不防小人的鸡肋的功能,针对小白还行. 代码如下: <script> //都能支持 document.oncontextmenu = function (e) { retur ...

  4. 【实践】Matlab2016a的mdce集群搭建

    Matlab R2016a的mdce集群搭建 1.解压文件Matlab_R2016b_win64.iso. 文件下载地址:链接:https://pan.baidu.com/s/1mjJOaHa 密码: ...

  5. CSS选择器中带点(.)怎么办?

    在SharePoint中很多元素的ID都用点(.)来连接的,比如: <li class="ms-cui-group" id="Ribbon.Documents.Ed ...

  6. 织梦dedeCMS数据库结构字段说明-简略说明

    dede_addonarticle 附加文章表 aid int(11) 文章编号typeid int(11) 分类栏目编号body mediumtext 文章内容dede_addonflash 附加F ...

  7. Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

    # yum install -y vim Loaded plugins: fastestmirror, presto Loading mirror speeds from cached hostfil ...

  8. liunx rm 命令修改

    原文:https://blog.csdn.net/Ace_Shiyuan/article/details/60139791 1.打开一个终端,输入命令:vim ~/.bashrc Linux下修改rm ...

  9. hdu3183 rmq求区间最值的下标

    两个月前做的题,以后可以看看,是rmq关于求区间最值的下标 /* hdu3183 终点 给一个整数,可以删除m位,留下的数字形成一个新的整数 rmq 取n-m个数,使形成的数最小 */ #includ ...

  10. python3笔记(二)Python语言基础

    缩进 要求严格的代码缩进是python语法的一大特色,就像C语言家族(C.C++.Java等等)中的花括号一样重要,在大多数场合还非常有必要.在很多代码规范里面也都有要求代码书写按照一定的规则进行换行 ...