博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1079[SCOI2008]着色方案
阅读量:6171 次
发布时间:2019-06-21

本文共 1122 字,大约阅读时间需要 3 分钟。

题意:

有n个木块排成一行,有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块,所有油漆刚好足够涂满所有木块。求任意两个相邻木块颜色不同的着色方案。k≤15,ci≤5

题解:

解决本题关键是ci≤5,所以以剩余可涂方块数为1,2,3,4,5及上次涂的色这次剩余可涂方块数为状态,做dp就行了。

代码:

1 #include 
2 #include
3 #include
4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5 #define ll long long 6 #define mod 1000000007 7 using namespace std; 8 9 ll f[16][16][16][16][16][6],k,c[16],rem[6];10 ll dfs(int a,int b,int c,int d,int e,int g){11 if(a+b+c+d+e==0)return 1; long long &ff=f[a][b][c][d][e][g];12 if(ff!=-1)return ff; ff=0;13 if(a)ff=(ff+(ll)(a-(g==1))*dfs(a-1,b,c,d,e,0))%mod;14 if(b)ff=(ff+(ll)(b-(g==2))*dfs(a+1,b-1,c,d,e,1))%mod;15 if(c)ff=(ff+(ll)(c-(g==3))*dfs(a,b+1,c-1,d,e,2))%mod;16 if(d)ff=(ff+(ll)(d-(g==4))*dfs(a,b,c+1,d-1,e,3))%mod;17 if(e)ff=(ff+(ll)(e-(g==5))*dfs(a,b,c,d+1,e-1,4))%mod;18 return ff;19 }20 int main(){21 scanf("%d",&k); inc(i,1,k)scanf("%d",&c[i]),rem[c[i]]++;22 memset(f,-1,sizeof(f)); printf("%lld",dfs(rem[1],rem[2],rem[3],rem[4],rem[5],0));23 return 0;24 }

 

20160517

转载于:https://www.cnblogs.com/YuanZiming/p/5732649.html

你可能感兴趣的文章
VS工具使用
查看>>
CISCO交换机端口安全
查看>>
我的友情链接
查看>>
修改input框中placeholder的字体颜色
查看>>
关于ELK
查看>>
DG 查询/切换的相关命令
查看>>
Dbutils 介绍和使用
查看>>
VMwareESX/ESXi与厚置备(thick)虚拟机磁盘转换精简置备(thin)磁盘
查看>>
恒生电子的一道笔试题
查看>>
学习Android Studio里的Gradle
查看>>
mysql主从复制
查看>>
How to Install and Configure Zabbix on CentOS 7
查看>>
Lucene查询结果高亮
查看>>
【转载】ARX如何得到当前CAD打印设备列表及其他打印设置内容
查看>>
MathType编辑双向斜箭头的教程
查看>>
对于MathType中公式与文字错位的问题怎么解决
查看>>
正则表达式
查看>>
【Android】修改包名
查看>>
[BZOJ1076][SCOI2008]奖励关[状压DP+概率期望]
查看>>
linux内核数据结构之链表
查看>>