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个可以用两次的,还剩下ccc个可以用三次的,还剩下eee个可以用四次的,还剩下ddd个可以用五次的时候的方案数。
再次强调:状态真是妙啊。
注意到如果这次选可以用i次的,上一次选的是可以用i+1次的这一次的转移系数要减1。
因为上一次那种可以用i+1i+1i+1次的这一次只能用iii次了,所以转移时不能用这一种来转移。
代码:
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int n,f[16][16][16][16][16][6],cnt[6];
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
inline int dfs(int a,int b,int c,int d,int e,int las){
if(~f[a][b][c][d][e][las])return f[a][b][c][d][e][las];
if(!(a|b|c|d|e))return f[a][b][c][d][e][las]=1;
f[a][b][c][d][e][las]=0;
if(a)(f[a][b][c][d][e][las]+=(long long)(a-(las==2))*dfs(a-1,b,c,d,e,1)%mod)%=mod;
if(b)(f[a][b][c][d][e][las]+=(long long)(b-(las==3))*dfs(a+1,b-1,c,d,e,2)%mod)%=mod;
if(c)(f[a][b][c][d][e][las]+=(long long)(c-(las==4))*dfs(a,b+1,c-1,d,e,3)%mod)%=mod;
if(d)(f[a][b][c][d][e][las]+=1ll*(d-(las==5))*dfs(a,b,c+1,d-1,e,4)%mod)%=mod;
if(e)(f[a][b][c][d][e][las]+=1ll*e*dfs(a,b,c,d+1,e-1,5)%mod)%=mod;
return f[a][b][c][d][e][las];
}
int main(){
memset(f,-1,sizeof(f)),scanf("%d",&n);
for(int i=1;i<=n;++i)++cnt[read()];
cout<<dfs(cnt[1],cnt[2],cnt[3],cnt[4],cnt[5],0);
return 0;
}
2018.10.20 bzoj1079: [SCOI2008]着色方案(多维dp)的更多相关文章
- BZOJ1079 [SCOI2008]着色方案[组合计数DP]
$有a_{1}个1,a_{2}个2,...,a_{n}个n(n<=15,a_{n}<=5),求排成一列相邻位不相同的方案数.$ 关于这题的教训记录: 学会对于复杂的影响分开计,善于发现整体 ...
- BZOJ1079 [SCOI2008]着色方案 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1079 题目概括 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的 ...
- 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.相邻两个木块涂相同色显得很难看 ...
- [luogu2476][bzoj1079][SCOI2008]着色方案【动态规划】
题目描述 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+-+ck=n.相邻两个木块涂相同色显得很难 ...
- BZOJ1079: [SCOI2008]着色方案 (记忆化搜索)
题意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很 ...
- 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 ...
随机推荐
- leetcode91
class Solution { public int numDecodings(String s) { if(s.length()==0){ return 0; } int[] dp = new i ...
- EXCEL 数组公式
数组里的元素,同一行内的各元素用英文逗号“,”分开,用英文分号“;”将各行分开 3.单列数组与单行数组的计算 两个数组相加,查看结果是几行几列:在任意单元格输入公式“=A80:A83+B87:E87” ...
- import 语句用于导入从外部模块,另一个脚本等导出的函数,对象或原语。
import 语句用于导入从外部模块,另一个脚本等导出的函数,对象或原语. 注意:此功能目前无法在任何浏览器中实现.它在许多转换器中实现,例如 Traceur Compiler , Babel , R ...
- How to Pronounce INTERNATIONAL
How to Pronounce INTERNATIONAL Share Tweet Share Tagged With: Dropped T How do you pronounce this lo ...
- mahout版本兼容问题
运行mahout in action上的cluster示例时报错:Error: Found interface org.apache.hadoop.mapreduce.Counter, but cla ...
- Ansible test
[root@localmesos ansible_test]# ansible all -a "/bin/echo hello"192.168.111.111 | SUCCESS ...
- centos7部署cacti
一.centos部署cacti 1. 关闭selinux. 2.fabric一键部署lamp 3. 设置mysql密码123456 1 mysql_secure_installation 4. 安装s ...
- 【校招面试 之 剑指offer】第10-1题 斐波那契数列
递归以及非递归实现: #include<iostream> using namespace std; long long fun(long long n){ if(n == 0){ ret ...
- 【校招面试 之 C/C++】第8题 C++中的静态绑定与动态绑定
转自:https://blog.csdn.net/chgaowei/article/details/6427731 做了部分修改 为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有 ...
- My97DatePicker 日历控件
My97DatePicker 是一款非常强大的日历控件,使用也非常简单,也能修改源码,牛逼我就不吹了,自己用用看 使用 1.引入 <script language="javascrip ...