1079: [SCOI2008]着色方案

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2237  Solved: 1361
[Submit][Status][Discuss]

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

题解

令人恶心的一道 $DP$ ...

注意到 $k$ 的范围很小, 所以首先我们可以想到的定义状态的方案是把每种油漆剩余的数量定义进状态, 但是 $15$ 维的记忆化数组怕是是个人都不想写吧...而且$5^{15}\approx 3.05\times 10^{10}$ 并不能开得下...

但是我们会发现, 其实不同的油漆只要余量相等, 对于答案的影响并没有什么区别, 所以我们可以分别将余量为 $1,2,3,4,5$ 的油漆种数定义进状态, 再加一维表示上次用的是哪种油漆, $DFS$ 处理就好了

代码挺好写, 但看起来比较恶心...

参考代码

GitHub

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm> const int MOD=1e9+;
const int MAXN=; int n;
int data[MAXN];
int dp[MAXN][MAXN][MAXN][MAXN][MAXN][]; int DFS(int,int,int,int,int,int); int main(){
scanf("%d",&n);
int tmp;
for(int i=;i<n;i++){
scanf("%d",&tmp);
data[tmp]++;
}
for(int i=;i<=;i++){
dp[][][][][][i]=;
}
printf("%d\n",DFS(data[],data[],data[],data[],data[],));
return ;
} int DFS(int r1,int r2,int r3,int r4,int r5,int last){
if(dp[r1][r2][r3][r4][r5][last]!=)
return dp[r1][r2][r3][r4][r5][last];
else{
long long tmp=;
if(r1>)
tmp+=1ll*(last==?r1-:r1)*DFS(r1-,r2,r3,r4,r5,);
if(r2>)
tmp+=1ll*(last==?r2-:r2)*DFS(r1+,r2-,r3,r4,r5,);
if(r3>)
tmp+=1ll*(last==?r3-:r3)*DFS(r1,r2+,r3-,r4,r5,);
if(r4>)
tmp+=1ll*(last==?r4-:r4)*DFS(r1,r2,r3+,r4-,r5,);
if(r5>)
tmp+=1ll*r5*DFS(r1,r2,r3,r4+,r5-,);
dp[r1][r2][r3][r4][r5][last]=tmp%MOD;
return dp[r1][r2][r3][r4][r5][last];
}
}

Backup

最新文章

  1. 读书笔记:《HTML5开发手册》--HTML5新的结构元素
  2. myeclipse学习总结二(myeclipse安装svn插件)
  3. jdbc java数据库连接 8)防止sql注入
  4. No.25
  5. Mac 效率工具
  6. Selenium2学习-039-WebUI自动化实战实例-文件上传下载
  7. mybatis3.2.3+spring3 控制台打印sql解决办法
  8. Ip地址查询
  9. linux中预留的$变量
  10. Java解析HTML之HTMLParser使用与详解
  11. 让谷歌浏览器 chrome 支持小于12px的字体
  12. STM32管教复用与重映射关系
  13. jQuery 实验教程
  14. [ionic开源项目教程] - 第5讲 如何在项目中使用全局配置
  15. 嵌入式 H264视频通过RTMP直播
  16. 在vs环境中跑动sift特征提取(原理部分)
  17. boost.asio源码阅读(1) - 从chat_server开始
  18. DOS命令(一)
  19. Filter过滤器 不登陆无法访问其他页面
  20. 从零开始学 Web 之 BOM(三)offset,scroll,变速动画函数

热门文章

  1. Linux显示查看您拥有的仓库
  2. tar (child): jdk-7u71-linux-x64.tar.gz:无法 open: 没有那个文件或目录
  3. IOS开发之XCode学习011:UISwitch控件
  4. div里面的图片垂直居中
  5. UML类图10分钟快速入门
  6. Java多线程之Callable接口的实现
  7. 如何通过java反射的方式对java私有方法进行单元测试
  8. link-cut-tree 简单介绍
  9. 【BZOJ3506】排序机械臂(Splay)
  10. ES2015 类 class 语法