题目链接

思想

显然我们后面的决策是跟前一步相关的,因此我们可以考虑DP,可以用一个15维的数组来进行转移,但是这样显然回mle,所以我们考虑如何压缩状态,由于1<=Ci<=51 <= C_i <= 51<=Ci​<=5,所以我们可以有dp数组:
dp[a1][a2][a3][a4][a5][last]dp[a_1][a_2][a_3][a_4][a_5][last]dp[a1​][a2​][a3​][a4​][a5​][last],a1a_1a1​表示可以涂1块木块的有多少种颜色,以此类推,lastlastlast表示上一次用的是可以涂lastlastlast个木块的颜色。

接下来就是考虑dp方程的转移了。
举个例子:
假设上一次用的颜色是可以涂5个块的,那么下一步的状态转移就会变成:
sum=a1∗dp[a1−1][a2][a3][a4][a5][1]+a2∗dp[a1+1][a2−1][a3][a4][a5][2]+a3∗dp[a1][a2+1][a3−1][a4][a5][3]+(a4−1)∗dp[a1][a2][a3+1][a4−1][a5][4]+a5∗dp[a1][a2][a3][a4+1][a5−1][5]sum = a_1 * dp[a_1 - 1][a2][a3][a_4][a_5][1] + a_2 * dp[a_1 + 1][a_2 - 1][a_3][a_4][a_5][2] + a_3 * dp[a_1][a_2 + 1][a_3 - 1][a_4][a_5][3] + (a4 - 1) * dp[a_1][a_2][a_3 + 1][a_4 - 1][a_5][4] + a5 * dp[a_1][a_2][a_3][a_4 + 1][a_5 - 1][5]sum=a1​∗dp[a1​−1][a2][a3][a4​][a5​][1]+a2​∗dp[a1​+1][a2​−1][a3​][a4​][a5​][2]+a3​∗dp[a1​][a2​+1][a3​−1][a4​][a5​][3]+(a4−1)∗dp[a1​][a2​][a3​+1][a4​−1][a5​][4]+a5∗dp[a1​][a2​][a3​][a4​+1][a5​−1][5]

之所以a4−1a_4 - 1a4​−1是因为,上一步选的是5,所以转移过来的时候a4+1a_4 + 1a4​+1,这里面有一个是跟上一个块同颜色的,所以需要减去,其他情况同理。

考虑到数据比较小,并且这个dp方程有点难转移,因此我们可以考虑用记忆化搜索来进行dp转移。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int mod = 1e9 + 7;ll dp[20][20][20][20][20][10];
int n, a[10];ll dfs(int a1, int a2, int a3, int a4, int a5, int last) {if(dp[a1][a2][a3][a4][a5][last]) return dp[a1][a2][a3][a4][a5][last];ll ans = 0;if(a1) ans = (ans + 1ll * (a1 - (last == 2)) * dfs(a1 - 1, a2, a3, a4, a5, 1)) % mod;if(a2) ans = (ans + 1ll * (a2 - (last == 3)) * dfs(a1 + 1, a2 - 1, a3, a4, a5, 2)) % mod;if(a3) ans = (ans + 1ll * (a3 - (last == 4)) * dfs(a1, a2 + 1, a3 - 1, a4, a5, 3)) % mod;if(a4) ans = (ans + 1ll * (a4 - (last == 5)) * dfs(a1, a2, a3 + 1, a4 - 1, a5, 4)) % mod;if(a5) ans = (ans + 1ll * a5 * dfs(a1, a2, a3, a4 + 1, a5 - 1, 5)) % mod;return dp[a1][a2][a3][a4][a5][last] = ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read();for(int i = 1; i <= n; i++) {int x = read();a[x]++;}for(int i = 1; i <= 5; i++) dp[0][0][0][0][0][i] = 1;print(dfs(a[1], a[2], a[3], a[4], a[5], 0));return 0;
}

[SCOI2008]着色方案(DP)相关推荐

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

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

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

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

  3. bzoj1079: [SCOI2008]着色方案

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

  4. bzoj 1079 [SCOI2008]着色方案

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

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

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

  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. bzoj 1079: [SCOI2008]着色方案

    思路:按个数分类dp 1 #include<bits/stdc++.h> 2 #define LL long long 3 #define fi first 4 #define se se ...

最新文章

  1. js选择日期即时把两个日期相差天数显示出来?
  2. MySQL Group Replication-MGR集群简介
  3. Spark 运行机制
  4. C#操作config文件
  5. W3school和W3Cschool的区别
  6. apple 官网系统软件下载如Command Line Tools下载
  7. 给予Java初学者的学习路线建议(转)
  8. ysoserial exploit/JRMPListener原理剖析
  9. 新生儿小名大全:农历三月出生的女孩小名
  10. 网站安全防护措施有哪些
  11. AR手游《悠梦2》再获苹果推荐,下载《网易洞见》可免费试玩
  12. 密度计算机公式,密度浓度换算公式(浓度和密度的换算关系)
  13. 函数间断点类型及其判别方法
  14. 进程、线程与协程傻傻分不清?一文带你吃透!
  15. 电子设计PCB-Altium笔记
  16. SCL3400-D01双轴高精度倾角计
  17. WEB安全——CS中Beacon的使用
  18. html制作唐诗三百首,《唐诗三百首》
  19. mnist手写数字模型训练、保存、加载及图片预测
  20. 恶意邮件智能监测与溯源技术研究

热门文章

  1. 当女朋友学会「监视」男朋友......
  2. python win7 sp1_[ Python - 15 ] win7安装paramiko问题总汇
  3. ant vue 语言_Ant Design Vue是什么
  4. axure 组件_技巧分享 | Axure后台组件制作的全过程
  5. js 定时网页点击_反爬 JS 逆向,扣代码解密分析
  6. java调用js查询mongo_mongodb操作之使用javaScript实现多表关联查询
  7. 小肚皮最新版本_小肚皮官方版下载_小肚皮app - Win7旗舰版
  8. 怎么用计算机计算出选手最后得分,WPS技巧:TRIMMEAN函数计算选手得分
  9. 查询程序崩溃日志_PC 崩溃报告途径 amp; 临时解决方法
  10. python编译安装没有c扩展_为什么在安装simplejson时得到“C扩展无法编译”?