由于最终的染色只与ci为几的个数有关,因此定义状态f[a][b][c][d][e][p]表示有a个ci=1,b个ci=2,……,有e个ci=5,上一次选择了ci=p的。状态的转移:发现p会让p-1少选一次,因此可以写出方程(详见代码),可以用记忆化搜索来写。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 long long n,k,s[6],f[16][16][16][16][16][6];
4 long long dfs(int a,int b,int c,int d,int e,int p){
5 if (f[a][b][c][d][e][p])return f[a][b][c][d][e][p];
6 if (a)f[a][b][c][d][e][p]+=(a-(p==2))*dfs(a-1,b,c,d,e,1);
7 if (b)f[a][b][c][d][e][p]+=(b-(p==3))*dfs(a+1,b-1,c,d,e,2);
8 if (c)f[a][b][c][d][e][p]+=(c-(p==4))*dfs(a,b+1,c-1,d,e,3);
9 if (d)f[a][b][c][d][e][p]+=(d-(p==5))*dfs(a,b,c+1,d-1,e,4);
10 if (e)f[a][b][c][d][e][p]+=e*dfs(a,b,c,d+1,e-1,5);
11 return f[a][b][c][d][e][p]=f[a][b][c][d][e][p]%1000000007+1000000007;
12 }
13 int main(){
14 scanf("%lld",&n);
15 for(int i=1;i<=n;i++){
16 scanf("%lld",&k);
17 s[k]++;
18 }
19 for(int i=1;i<=5;i++)f[0][0][0][0][0][i]=1;
20 printf("%lld",dfs(s[1],s[2],s[3],s[4],s[5],0)-1000000007);
21 }

最新文章

  1. nodejs net模块
  2. 对二进制加密(分散保存-s=sy+a+b)
  3. PHP----遇到的Session问题
  4. 特征创建:Reference Characteristic、Template
  5. java开发之IO流
  6. 【python】求水仙数
  7. POJ 2674 Linear world
  8. 新手上路Tomcat 7.x和JDK的配置
  9. MySql连接问题
  10. 当使用System,out.println()打印一个对象是自动调用toString方法
  11. Installation error: INSTALL_FAILED_UID_CHANGED 的解决办法
  12. OpenCV问题集锦,图片显示不出来,WaitKey(0),imread()不能读图片,未经处理的异常,等问题集合
  13. 安装oracle数据库的操作步骤
  14. bzoj3467: Crash和陶陶的游戏
  15. django中数据库操作有关部分
  16. 常用的Unicode值范围
  17. js对json格式对象进行增加,修改,删除
  18. 设置UITableView分割线距左边的间距
  19. 搭建OpenStack先电云平台
  20. GPU寄存器相关

热门文章

  1. [FFMpeg] 非标准分辨率视频Dump YUV注意事项
  2. Pytorch学习2020春-1-线性回归
  3. mybatis-plus最新版代码生成器(Swagger3)
  4. javascriptRemke之原型的重要性
  5. NOI 2021 部分题目题解
  6. python中\t、\n含义
  7. hadoop学习笔记:运行wordcount对文件字符串进行统计案例
  8. Rvalue References
  9. Windows 安装 gcc
  10. HashMap、ConcurrentHashMap红黑树实现分析