【BZOJ1079】【SCOI2008】着色方案
Time Limit: 10 Sec Memory Limit: 162 MB
Description
有n个木块排成一行,从左到右依次编号为1~n。你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块。
所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n。相邻两个木块涂相同色显得很难看,所以你希望统计任意两
个相邻木块颜色不同的着色方案。
Input
第一行为一个正整数k,第二行包含k个整数c1, c2, ... , ck。
Output
输出一个整数,即方案总数模1,000,000,007的结果。
Sample Input
3
1 2 3
Sample Output
10
HINT
100%的数据满足:1 <= k <= 15, 1 <= ci <= 5
Solution
是不是还想状压啊,行不通的,状态数太多了。
看看还有什么是比较小的:\(c_i\)看起来很小。
仔细想一想会发现,如果两种颜料的可使用次数相同,那么它们可以归为一类颜料。
从可使用次数分类入手,设状态\(f[a_1][a_2][a_3][a_4][a_5][x]\),表示当前已使用\(i\)次的颜料有\(a_i\)种,且下一步将要选择当前可使用\(x\)次的颜料,的总方案数。
干脆就自顶向下使用记忆化搜索DP实现。每个状态从哪里转移就很显然了:可以挑5类颜料中的一种,那么转移的来源就是\(\{a_1-1,a_2,a_3,a_4,a_5\}\),\(\{a_1+1,a_2-1,a_3,a_4,a_5\}\),\(\{a_1,a_2+1,a_3-1,a_4,a_5\}\),\(\{a_1,a_2,a_3+1,a_4-1,a_5\}\),\(\{a_1,a_2,a_3,a_4+1,a_5-1\}\)。
关键是转移的系数和递归参数。简单的讲,每类颜料\(i\)有\(a_i\)种不同的选法,但这没有考虑到题目要求两两不同给的限制。
注意每个状态的\(a_i\)是相对于当前状态下的信息,而\(x\)则是上一层状态给你做出的限制。你枚举当前这一步将要挑哪一类颜料,递归的时候就要把这类颜料作为下一步的\(x\)传进去,表示你下一层自己选择的时候,如果要选我这一层选择的这类颜料,你可用的选择数必须减1,否则将会和我冲突。而上一层递归给这一层传进了\(x\),说明上一层递归所挑的颜料在上一层为第\(x\)类,那么在这一层则是第\(x-1\)类(没用之前即减1)。如果你枚举当前层选择了第\(x-1\)类颜料,可用方案数必须减1。
需要梳理一下思路和控制关系,实现起来并不难。
#include <cstdio>
#include <cstring>
using namespace std;
const int N=16,MOD=1e9+7;
int n,a[6],c[6];
int f[N][N][N][N][N][6];
int dfs(int a1,int a2,int a3,int a4,int a5,int x){
int &F=f[a1][a2][a3][a4][a5][x];
if(F!=-1) return F;
F=0;
if(a1)
(F+=1LL*dfs(a1-1,a2,a3,a4,a5,1)*(a1-(x-1==1))%MOD)%=MOD;
if(a2)
(F+=1LL*dfs(a1+1,a2-1,a3,a4,a5,2)*(a2-(x-1==2))%MOD)%=MOD;
if(a3)
(F+=1LL*dfs(a1,a2+1,a3-1,a4,a5,3)*(a3-(x-1==3))%MOD)%=MOD;
if(a4)
(F+=1LL*dfs(a1,a2,a3+1,a4-1,a5,4)*(a4-(x-1==4))%MOD)%=MOD;
if(a5)
(F+=1LL*dfs(a1,a2,a3,a4+1,a5-1,5)*a5%MOD)%=MOD;
return F;
}
int main(){
freopen("input.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
c[x]++;
}
memset(f,-1,sizeof f);
for(int i=0;i<=5;i++)
f[0][0][0][0][0][i]=1;
printf("%d\n",dfs(c[1],c[2],c[3],c[4],c[5],0));
return 0;
}
【BZOJ1079】【SCOI2008】着色方案的更多相关文章
- BZOJ1079 [SCOI2008]着色方案 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1079 题目概括 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的 ...
- [luogu2476][bzoj1079][SCOI2008]着色方案【动态规划】
题目描述 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+-+ck=n.相邻两个木块涂相同色显得很难 ...
- BZOJ1079:[SCOI2008]着色方案(DP)
Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个 ...
- BZOJ1079 [SCOI2008]着色方案 【dp记忆化搜索】
题目 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+-+ck=n.相邻两个木块涂相同色显得很难看 ...
- BZOJ1079: [SCOI2008]着色方案 (记忆化搜索)
题意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很 ...
- 2018.10.20 bzoj1079: [SCOI2008]着色方案(多维dp)
传送门 dp妙题. f[a][b][c][d][e][last]f[a][b][c][d][e][last]f[a][b][c][d][e][last]表示还剩下aaa个可以用一次的,还剩下bbb个可 ...
- BZOJ1079 [SCOI2008]着色方案[组合计数DP]
$有a_{1}个1,a_{2}个2,...,a_{n}个n(n<=15,a_{n}<=5),求排成一列相邻位不相同的方案数.$ 关于这题的教训记录: 学会对于复杂的影响分开计,善于发现整体 ...
- bzoj1079: [SCOI2008]着色方案
dp.以上次染色时用的颜色的数量和每种数量所含有的颜色作状态. #include<cstdio> #include<algorithm> #include<cstring ...
- 【记忆化搜索】bzoj1079 [SCOI2008]着色方案
#include<cstring> #include<cstdio> using namespace std; #define MOD 1000000007 typedef l ...
- bzoj1079: [SCOI2008]着色方案
ci<=5直接想到的就是5维dp了...dp方程YY起来很好玩...写成记忆化搜索比较容易 #include<cstdio> #include<cstring> #inc ...
随机推荐
- Datawhale MySQL 训练营 Task6 实战项目
作业 项目十:行程和用户(难度:困难) Trips 表中存所有出租车的行程信息.每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键.St ...
- Visionpro介绍和下载安装视频教程
------------------------Halcon,Visionpro高清视频教程,点击下载视频--------------------------
- Solidity 神器Remix
1 功能 这里我们使用在线编译器,打开网址 https://ethereum.github.io/browser-solidity 1.1 文件夹管理 最左边是文件夹管理,里面列出了当前工作区里的文件 ...
- Sqlmap常用命令大全
1 Options(选项) -h,--help 显示帮助消息-hh 显示详细帮助-version -v VERBOSE 详细级别 0-6 默认12 Target 目标-u URL--url=URL-g ...
- IntelliJ IDEA 自动编译功能无法使用,On 'update' action:选项里面没有update classes and resources这项
https://zhidao.baidu.com/question/1381265197230335740.html
- 软件工程第十周psp
1.PSP表格 2.进度条 3.饼状图 4.折线图
- java第四次实验报告
课程:Java程序与设计 班级:1352 姓 名:池彬宁 小组成员: 20135212池彬宁 20135208贺邦 学号:20135212 成绩: 指导教师:娄嘉鹏 ...
- Task 6.2冲刺会议七 /2015-5-20
今天把主界面改善了一下,主要功能时摄像头的使用以及语音聊天的部分,两个部分的设计原理基本相同,但是可是好几个模块让有点不知道该怎么下手.这时候我感觉到了模块拼接是很困难的,只有十分清楚每个模块才能很好 ...
- QQ测试计划
- CentOS7服务器上搭建Gitlab
Gitlab如何搭建? 安装gitlab所需要的依赖 sudo yum install curl policycoreutils openssh-server openssh-clients 使ssh ...