传送门

数学太珂怕了……膜一下->这里

记\(sum[i]\)为题中\(c[i]\)的前缀和,\(C[i][j]\)表示\(C_{i}^j\)

设\(f[i][j]\)表示前面\(i\)中颜色已经涂完且涂了\(sum[i]\)块,其中有\(j\)对相同的色块的方案数

考虑第\(i+1\)种颜色

把\(c[i+1]\)个分成\(a\)组,总共有\(C_{c[i+1]-1}^{a-1}\)中方案(相当于\(c[i+1]-1\)个空格中取出\(a-1\)个)

将\(b\)组插入到同色的之间,\(a-b\)组插入到不同色的之间,那么可以转移到\(f[i+1][j-b+c[i+1]-a]\)

方案数为$$f[i][j]C_{c[i+1]-1}{a-1}*C_jbC_{sum[i]+1-j}^{a-b}$$

其中\(C_j^b\)表示在\(j\)个空之间插入\(b\)个的方案数

\(C_{sum[i]+1-j}^{a-b}\)表示共\(sum[i]+1\)个位置,\(j\)个不能放,剩下的位置放\(a-b\)个的方案数

dp即可,答案为\(f[n][0]\)

//minamoto
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int n,c[25],sum[25],C[105][105],f[25][105];
void init(){
for(int i=0;i<=75;++i)C[i][0]=1;
for(int i=1;i<=75;++i)for(int j=1;j<=i;++j)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
int main(){
init(),scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&c[i]),sum[i]=sum[i-1]+c[i];
f[1][c[1]-1]=1;
for(int i=1;i<n;++i)for(int j=0;j<sum[i];++j){
if(!f[i][j])continue;
for(int a=1;a<=c[i+1];++a)for(int b=0;b<=a&&b<=j;++b){
int res=1ll*f[i][j]*C[c[i+1]-1][a-1]%mod*C[j][b]%mod;
res=1ll*res*C[sum[i]+1-j][a-b]%mod;
(f[i+1][j+c[i+1]-a-b]+=res)%=mod;
}
}
printf("%d\n",f[n][0]);return 0;
}

P2476 [SCOI2008]着色方案的更多相关文章

  1. LUOGU P2476 [SCOI2008]着色方案

    传送门 解题思路 毒瘤题,,刚开始写了个奇奇怪怪的哈希,结果T了5个点..后来深(kan)入(le)思(ti)考(jie),发现c的范围很小,设$f[a][b][c][d][e][pre]​$表示还能 ...

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

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

  3. bzoj1079: [SCOI2008]着色方案

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

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

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

  5. [SCOI2008]着色方案

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

  6. [SCOI2008] 着色方案[高维dp]

    321. [SCOI2008] 着色方案 ★★★   输入文件:color.in   输出文件:color.out   简单对比时间限制:1 s   内存限制:64 MB 题目背景: 有n个木块排成一 ...

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

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

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

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

  9. 【状态表示】Bzoj1096 [SCOI2008] 着色方案

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

随机推荐

  1. git-github 提示Permission denied (publickey) (windows)

    这种绝大多数情况是由于公钥设置的问题. 1.生成公钥 参考地址:https://help.github.com/articles/generating-a-new-ssh-key-and-adding ...

  2. Java AOP

    AOP 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之.翻译过来 ...

  3. 【NOIP2017练习】鏖战字符串(斜率优化DP)

    题意: 在决胜局中,Abwad决定和nbc鏖战字符串,比的是谁能更快地将一个“量子态的字符串”删除.“量子态的字符串”的每个字符都有一个删除难度dif[i].“量子态的字符串”非常顽固,只能先分割成若 ...

  4. 整体二分初识--POJ2104:K-th Number

    n<=100000个数有m<=5000个询问,每次问区间第k大. 方法一:主席树!…… 方法二:整体二分. 整体二分一次性计算半个值域对一个区间的询问的贡献,然后根据“这半边的贡献在某个询 ...

  5. hdu3756(三分)

    题意:三维坐标轴,有以原点为圆心,底面在xoy平面上,顶点在z轴上的圆锥,问圆锥的最小体积为多少才能完全覆盖空间里的所有点(n<=10000) 分析: 很容易想到转成二维问题,将其投影到xoz平 ...

  6. (linux shell)第一章--小试牛刀(下)

    文章来源: (linux shell)第一章--小试牛刀(下) 1.6 数组和关联数组 1.6.1 预备知识 Bash同一时候支持普通数组和关联数组.普通数组仅仅能使用整数作为数组索引,而关联数组能够 ...

  7. POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)

    Party at Hali-Bula Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5660   Accepted: 202 ...

  8. iOS NSMutableDictionary中UIImage的存储和读取

    思路:将UIImage转换成NSData,然后插入到NSMutableDictionary中.读取时,用NSData读出来,然后再转换成UIImage -存储 UIImage *image = [se ...

  9. codeforces 552 C Vanya and Scales

    这个题的意思就是给出一个数m.以及一个以1为首元素.w为比例常数的等比数列,数列长度为101,数列中每一个数字最多仅仅能用一次.问是否存在xa+wb+--=wc+wd+--+we+m. 非常显然,换句 ...

  10. FreeRTOS系列第14篇---FreeRTOS任务通知

    注:本文介绍任务通知的基础知识,具体源代码分析见<FreeRTOS高级篇8---FreeRTOS任务通知分析> 每一个RTOS任务都有一个32位的通知值,任务创建时,这个值被初始化为0.R ...