\(\\\)

\(Description\)


给出\(K\)种颜料各自的个数\(C_i\),每一个颜料只够涂一个格子,求将颜料用完,涂一排格子,每个格子只能涂一次的条件下,相邻两个格子的颜色互不相同的方案数对\(10^9+7\)取模的结果。

  • \(K\in [1,15]\),\(C_i\in [1,5]\)

\(\\\)

\(Solution\)


想的map压缩状态量记搜挂了

想的容斥记搜求组合数排列数取反挂了

正解真是神仙计数题做的还是少,基本的思路模型还是没有。

  • 注意到颜色相同的颜料性质是一致的。
  • 基于开始想的两种方案状态量太大,记搜也会超时,而将一类颜料看作一种之后,状态量大大减少,相当于只有\(5\)种颜料,状态里还需记录上一个颜料属于哪一类即可。
  • 设计状态\(f[n_1][n_2][n_3][n_4][n_5][last]\)表示,剩余个数分别为\(1\text~5\)的颜料各有几个,上一次使用的颜料使用前剩几个,此时到用完所有颜料的总涂色方案数。
  • 搜起来就很简单啦,直接考虑搜哪一位递归下去,到全是\(0\)了答案就是\(1\),搜完累计答案时,因为一类颜料是相同的,所以直接乘上该决策的可行颜料个数。
  • 一些就我会犯的zz错误细节要注意:
    • 优先判断搜索的颜料还有没有再考虑搜没搜到过,否则会数组越界
    • 注意到状态设计是使用前剩几个所以判断可行颜料个数时,判断时应该是上一个是否是当前\(+1\)而不是是否相同,因为你拿了一次个数一定减了一个\(1\)。
    • \(+1-1\)的时候注意是成对存在的不要光顾着-1
  • 这样搜索的优越性在于,他的状态量少,代表性强,只关心相同性质的数的个数,与一些问题的精简状态量思想异曲同工但就是想不到在这里用。

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define R register
#define gc getchar
#define mod 1000000007ll
using namespace std;
typedef long long ll; inline ll rd(){
ll x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} ll n,s[10],f[16][16][16][16][16][10]; void dfs(ll n1,ll n2,ll n3,ll n4,ll n5,ll lst){
if((n1|n2|n3|n4|n5)==0ll){f[0][0][0][0][0][lst]=1ll;return;}
if(n1>0ll&&!f[n1-1][n2][n3][n4][n5][1]) dfs(n1-1,n2,n3,n4,n5,1);
if(n2>0ll&&!f[n1+1][n2-1][n3][n4][n5][2]) dfs(n1+1,n2-1,n3,n4,n5,2);
if(n3>0ll&&!f[n1][n2+1][n3-1][n4][n5][3]) dfs(n1,n2+1,n3-1,n4,n5,3);
if(n4>0ll&&!f[n1][n2][n3+1][n4-1][n5][4]) dfs(n1,n2,n3+1,n4-1,n5,4);
if(n5>0ll&&!f[n1][n2][n3][n4+1][n5-1][5]) dfs(n1,n2,n3,n4+1,n5-1,5);
if(n2>0ll) (f[n1][n2][n3][n4][n5][lst]+=(n2-(lst==3))*f[n1+1][n2-1][n3][n4][n5][2])%=mod;
if(n3>0ll) (f[n1][n2][n3][n4][n5][lst]+=(n3-(lst==4))*f[n1][n2+1][n3-1][n4][n5][3])%=mod;
if(n4>0ll) (f[n1][n2][n3][n4][n5][lst]+=(n4-(lst==5))*f[n1][n2][n3+1][n4-1][n5][4])%=mod;
if(n1>0ll) (f[n1][n2][n3][n4][n5][lst]+=(n1-(lst==2))*f[n1-1][n2][n3][n4][n5][1])%=mod;
if(n5>0ll)(f[n1][n2][n3][n4][n5][lst]+=n5*f[n1][n2][n3][n4+1][n5-1][5])%=mod;
} int main(){
n=rd();
for(R ll i=1;i<=n;++i) ++s[rd()];
dfs(s[1],s[2],s[3],s[4],s[5],6);
printf("%lld\n",f[s[1]][s[2]][s[3]][s[4]][s[5]][6]);
return 0;
}

[ SCOI 2008 ] 着色方案的更多相关文章

  1. [BZOJ 1079][SCOI 2008]着色方案

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2237  Solved: 1361[Submit][Stat ...

  2. bzoj 1079 着色方案

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

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

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

  4. 【BZOJ 1079】[SCOI2008]着色方案

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

  5. bzoj1079: [SCOI2008]着色方案

    ci<=5直接想到的就是5维dp了...dp方程YY起来很好玩...写成记忆化搜索比较容易 #include<cstdio> #include<cstring> #inc ...

  6. 完美卸载SQL Server 2008的方案

    转自完美卸载SQL Server 2008的方案 针对SQL数据库卸载不完全的现象,做了如下总结:   1,控制面板 卸载   首先,打开控制面板,按照"安装时间"进行排序,卸载S ...

  7. bzoj 1079: [SCOI2008]着色方案 DP

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 803  Solved: 512[Submit][Status ...

  8. BZOJ 1079: [SCOI2008]着色方案(巧妙的dp)

    BZOJ 1079: [SCOI2008]着色方案(巧妙的dp) 题意:有\(n\)个木块排成一行,从左到右依次编号为\(1\)~\(n\).你有\(k\)种颜色的油漆,其中第\(i\)种颜色的油漆足 ...

  9. [SCOI2008]着色方案

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2228  Solved: 1353[Submit][Stat ...

随机推荐

  1. 【Codeforces 264B】Good Sequences

    [链接] 我是链接,点我呀:) [题意] 让你在一个递增数组中选择一个最长子序列使得gcd(a[i],a[i+1])>1 [题解] 设f[i]表示以一个"含有素因子i的数字" ...

  2. 阿里云服务器Ubuntu 16.04 3安装mysql

    .更新系统 apt-get update [注意:要在root用户下] .安装mysql-server apt-get install mysql-serverapt-get install mysq ...

  3. Modify MySQL dump file the fatest way

    使用mysql命令导入mysqldump生成的sql文件时,为了提高导入速度,往往需要修改dump文件,但是面对一个几十GB的文件,这事儿就太崩溃了,最快速的方法是这么做: ( echo " ...

  4. spring boot & JsonParser

    spring boot https://stackoverflow.com/questions/29313687/trying-to-use-spring-boot-rest-to-read-json ...

  5. Codeforces 158B (数学)

    B. Mushroom Scientists time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  6. noip模拟赛 三角形

    [问题描述] 平面上有N条直线,用方程Aix + Biy +Ci =0表示.这些直线没有三线共点的.现在要你计算出用这些直线可以构造出多少三角形? 输入: 第1行:一个整数N(1 ≤ N≤ 30000 ...

  7. $inject的用法

    controller后面的$inject是用来注入函数的变量名称的

  8. Java发送带附件的QQ邮箱

    由于腾讯公司给QQ邮箱增加了一个授权码的密码保护,导致之前网上很多代码都不能用,于是就自己敲了一份demo. 注意在密码那里可能需要授权码,具体设置:http://service.mail.qq.co ...

  9. HDU 1248寒冰王座-全然背包或记忆化搜索

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  10. cf 749D Leaving Auction

    Leaving Auction time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...