思路:按个数分类dp

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define fi first
 4 #define se second
 5 #define mk make_pair
 6 #define pii pair<int,int>
 7 #define piii pair<int, pair<int,int> >
 8
 9 using namespace std;
10
11 const int N = 16;
12 const int M = 10 + 7;
13 const int inf = 0x3f3f3f3f;
14 const LL INF = 0x3f3f3f3f3f3f3f3f;
15 const int mod = 1e9 + 7;
16
17 int n, cur, sum, num[6];
18 int dp[2][6][N][N][N][N][N];
19
20 void add(int &a, int b) {
21     a += b; if(a >= mod) a-= mod;
22 }
23 int main() {
24     scanf("%d", &n);
25     for(int i = 1; i <= n; i++) {
26         int x; scanf("%d", &x);
27         num[x]++;
28         sum += x;
29     }
30     dp[cur][0][num[1]][num[2]][num[3]][num[4]][num[5]] = 1;
31
32     for(int i = 0; i < sum; i++) {
33         cur ^= 1;
34         for(int j = 0; j <= 5; j++)
35             for(int a = 0; a <= n; a++)
36                 for(int b = 0; b <= n; b++)
37                     for(int c = 0; c <= n; c++)
38                         for(int d = 0; d <= n; d++)
39                             for(int e = 0; e <= n; e++)
40                                 dp[cur][j][a][b][c][d][e] = 0;
41
42         for(int j = 0; j <= 5; j++) {
43             for(int a = 0; a <= n; a++) {
44                 for(int b = 0; b <= n; b++) {
45                     for(int c = 0; c <= n; c++) {
46                         for(int d = 0; d <= n; d++) {
47                             for(int e = 0; e <= n; e++) {
48                                 if(!dp[cur ^ 1][j][a][b][c][d][e]) continue;
49                                 if(e) {
50                                     LL cnt = e - (5 == j);
51                                     add(dp[cur][4][a][b][c][d + 1][e - 1], 1ll * dp[cur ^ 1][j][a][b][c][d][e] * cnt % mod);
52                                 }
53
54                                 if(d) {
55                                     LL cnt = d - (4 == j);
56                                     add(dp[cur][3][a][b][c + 1][d - 1][e], 1ll * dp[cur ^ 1][j][a][b][c][d][e] * cnt % mod);
57                                 }
58
59                                 if(c) {
60                                     LL cnt = c - (3 == j);
61                                     add(dp[cur][2][a][b + 1][c - 1][d][e], 1ll * dp[cur ^ 1][j][a][b][c][d][e] * cnt % mod);
62                                 }
63
64                                 if(b) {
65                                     LL cnt = b - (2 == j);
66                                     add(dp[cur][1][a + 1][b - 1][c][d][e], 1ll * dp[cur ^ 1][j][a][b][c][d][e] * cnt % mod);
67                                 }
68
69                                 if(a) {
70                                     LL cnt = a - (1 == j);
71                                     add(dp[cur][0][a - 1][b][c][d][e], 1ll * dp[cur ^ 1][j][a][b][c][d][e] * cnt % mod);
72                                 }
73                             }
74                         }
75                     }
76                 }
77             }
78         }
79     }
80     int ans = dp[cur][0][0][0][0][0][0];
81     printf("%d\n", ans);
82     return 0;
83 }
84 /*
85 */

转载于:https://www.cnblogs.com/CJLHY/p/9105887.html

bzoj 1079: [SCOI2008]着色方案相关推荐

  1. bzoj 1079 [SCOI2008]着色方案

    bzoj 1079 [SCOI2008]着色方案 Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所 ...

  2. BZOJ 1079: [SCOI2008]着色方案 记忆化搜索

    1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  3. bzoj1079: [SCOI2008]着色方案(DP)

    1079: [SCOI2008]着色方案 题目:传送门 题解: DP刚神多年前讲过的一道神题. 二话不说,上来就是一个六维数组:F[i][a][b][c][d][e]//表示上一次涂的颜色是还剩下i次 ...

  4. [BZOJ1079][SCOI2008]着色方案 dp

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2368  Solved: 1428 [Submit][St ...

  5. bzoj1079: [SCOI2008]着色方案

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MB Description 有n个木块排成一行,从左到右依次编号为1~n.你有k ...

  6. BZOJ1079 [SCOI2008]着色方案 记忆化搜索

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2826  Solved: 1682 [Submit][St ...

  7. bzoj1079 [SCOI2008]着色方案

    Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木 ...

  8. [SCOI2008]着色方案

    这题也是看了别人题解也才会做的. 题解: 本题用的记忆优化搜索,题目说了给的颜色可以恰好图够所有木块. 题目给了能涂几块木块的颜色一共有几种.因为我们不可以连续图,所以我们把他分开来涂色. 用dp[a ...

  9. [SCOI2008]着色方案(DP)

    题目链接 思想 显然我们后面的决策是跟前一步相关的,因此我们可以考虑DP,可以用一个15维的数组来进行转移,但是这样显然回mle,所以我们考虑如何压缩状态,由于1<=Ci<=51 < ...

最新文章

  1. android PhotoView的用法
  2. ??? error using == times matlab,matlab错误 Error using 怎么办?
  3. SylixOS DSP upgrade命令解析
  4. 8086汇编4位bcd码_逆向工程——汇编基础[一]
  5. Deep Belief Network简介——本质上是在做逐层无监督学习,每次学习一层网络结构再逐步加深网络...
  6. 【整理】SAP货币汇率转换
  7. 类加载器源码、双亲委派、自定义类加载器详解
  8. 3.vector实现字符串类
  9. 无线传感网1-简单介绍
  10. ExtJS 4无限制滚动条的Grid
  11. android 如何正确使用 泛型 和 多参数 “偷懒”
  12. linux安装mysql phpmyadmin_如何在Linux下安装和配置PHPmyadmin?
  13. 利用tcp协议实现大文件传输(socket)
  14. [附源码]PHP计算机毕业设计小斌美食网站(程序+LW)
  15. 计算机专业班级网站,班级网站毕业论文.doc
  16. 【知识贴】战争中的数学应用
  17. java实现移位密码的加密
  18. 让html前端的数字每天自己增加,前端开发神器Emmet,让你的代码输入效率瞬间翻倍...
  19. Ubuntu 12.04 常用三种输入法及键盘错乱的调整
  20. linux信号量对mysql_MySQL 信号量semaphore 和 innodb_adaptive_hash_index

热门文章

  1. 修改MySQL自动递增值
  2. ICCV 2019 | 华科提出对称限制的校正网络,显著改进场景文本识别
  3. oracle索引未使用,oracle - 未使用主键索引 - SO中文参考 - www.soinside.com
  4. v380云存储如何查询_使用 JuiceFS 在云上优化 Kylin 的存储性能
  5. 我们为什么要学习3D建模?
  6. Java至尊红颜_智能手机跨时代大作 摩托MPx220登场
  7. 支持向量机——深度AI科普团队
  8. 上海事职业培训软件测试高级,《软件测试人员(Java)(4级)》人力资源和社会保障部教材办公室、中国就业培训技术指导中心上海分中心、上海市职业培训研究发展中心 编_孔网...
  9. c语言单链表超市出库,c语言-单链表(二)
  10. Base64 + 变为 空格 问题分析