bzoj1079
50%的数据很好考虑,基本的dp了
关键到了100%,如果用每种颜色有ci种这种常规的写法,显然5^15会爆空间
考虑到反过来,ci<=5, 15^5是不会爆空间的
又想到,每一种颜色,如果数量相同的话,其实是等效的。
这样我们不难想到用f[a,b,c,d,e,last]表示剩余颜色数量(就是还能刷木块的数目)为1,2,3,4,5的颜色种数为a,b,c,d,e时,且上一个位置用了剩余颜色数量为last的颜色有多少种方案
然后是实现的问题,弱弱的我想了半天,因为剩余数量对应的颜色种数是可增可减的,
所以我觉得通常以循环实现好像有点困难(好像也是可以写的,但太弱了……)
后来发现网上写的都是记忆化搜索,然后发现记忆化搜索实现起来比较容易;
其实记忆化搜索的效率基本上就等同于dp了
方程略复杂但是还是很很好想的
const mo=;
var f:array[..,..,..,..,..,..] of int64;
sum:array[..] of longint;
i,n,m,x:longint; function ma(a,b:longint):longint;
begin
if a=b then exit() else exit();
end; function search(a,b,c,d,e,last:longint):int64;
var s:int64;
begin
if a+b+c+d+e= then //颜色用完了
begin
f[a,b,c,d,e,last]:=;
exit();
end;
if f[a,b,c,d,e,last]> then exit(f[a,b,c,d,e,last]); //记忆化
s:=; //累加这个位置上是用颜色数量为几的方案
if a> then s:=(s+(a-ma(last,))*search(a-,b,c,d,e,) mod mo) mod mo;
if b> then s:=(s+(b-ma(last,))*search(a+,b-,c,d,e,) mod mo) mod mo;
//个转移是同理的,我就挑第二个说一下吧,首先当前位置如果用数量为2的b种颜色,显然每种颜色涂都能带来相同的方案数
//显然,用了一个剩余数量为2的颜色涂当前位置,到下一个位置,剩余数量为1的颜色种类数肯定多了一个,剩余数量为2的颜色种数肯定少了一个
//但是我们要考虑到,假如上一个位置用的是剩余数量为3的颜色涂的话,到了当前位置,上一个涂的剩余颜色数量变为2了,显然这个颜色是不能再涂这个位置的,要减去多算的方案(是不是废话有点多……)
if c> then s:=(s+(c-ma(last,))*search(a,b+,c-,d,e,) mod mo) mod mo;
if d> then s:=(s+(d-ma(last,))*search(a,b,c+,d-,e,) mod mo) mod mo;
if e> then s:=(s+e*search(a,b,c,d+,e-,) mod mo) mod mo;
f[a,b,c,d,e,last]:=s; //记忆化
exit(s);
end; begin
readln(m);
for i:= to m do
begin
read(x);
n:=n+x;
inc(sum[x]);
end;
writeln(search(sum[],sum[],sum[],sum[],sum[],) mod mo);
end.
bzoj1079的更多相关文章
- BZOJ1079 [SCOI2008]着色方案 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1079 题目概括 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的 ...
- bzoj1079: [SCOI2008]着色方案
dp.以上次染色时用的颜色的数量和每种数量所含有的颜色作状态. #include<cstdio> #include<algorithm> #include<cstring ...
- bzoj1079: [SCOI2008]着色方案
ci<=5直接想到的就是5维dp了...dp方程YY起来很好玩...写成记忆化搜索比较容易 #include<cstdio> #include<cstring> #inc ...
- [luogu2476][bzoj1079][SCOI2008]着色方案【动态规划】
题目描述 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+-+ck=n.相邻两个木块涂相同色显得很难 ...
- BZOJ1079或洛谷2476 [SCOI2008]着色方案
一道记忆化搜索 BZOJ原题链接 洛谷原题链接 发现对于能涂木块数量一样的颜色在本质上是一样的,所以可以直接压在一个状态,而这题的数据很小,直接暴力开\(6\)维. 定义\(f[a][b][c][d] ...
- 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】着色方案
Time Limit: 10 Sec Memory Limit: 162 MB Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci ...
- BZOJ1079:[SCOI2008]着色方案(DP)
Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个 ...
- bzoj1079 着色方案 记忆化搜索(dp)
题目传送门 题目大意: 有k种颜色,每个颜色ci可以涂个格子,要求相邻格子颜色不能一样,求方案数.ci<=5,k<=15. 思路: 题目里最重要的限制条件是相邻格子颜色不能相同,也就是当前 ...
随机推荐
- 数据库性能优化一:SQL索引一步到位
SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...
- Java编程风格与命名规范整理
基本命名规范 包命名 包名按照域名的范围从大到小逐步列出,恰好和Internet上的域名命名规则相反. 由一组以“.”连接的标识符构成,通常第一个标识符为符合网络域名的两个或者三个英文小写字母. Pe ...
- struts2基于Convention插件的约定映射使用
一.首先说明一点:所谓的基于Convention插件的约定优于配置的使用,并不是严格意义上的零配置,struts.xml文件并不能完全舍弃. 获得Convention插件功能,所必需的jar包有:|a ...
- MFC Tips(一) 在程序内部 保存读取配置
//保存 CWinApp *pApp = AfxGetApp(); pApp->WriteProfileBinary(..); //保存结构体 pApp->WriteProfileInt( ...
- sharepoint2013 新建母板页 新建页面布局 关联母板页和页面布局
1 母板页的应用和layout(页面布局)的创建和应用 母板页上传:将准备好的html和样式 通过spd中的导入方式导入模版html, 导入后: 然后在网站设置中进行转换为母板页. 随后编辑 ...
- oracle 日期格式大全
to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...
- 00_ForTest
-----该页是爬虫的测试页请忽略------- 1234545@qq.comadasdsdasdsad阿打算多少其热情为 asdasdasdasd4w5wsdvv啊实打实大 啊实打实大asdasda ...
- 暑假集训(1)第六弹 -----简单计算器(Hdoj1237)
Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算 ...
- 九度OJ 1205 N阶楼梯上楼问题 -- 动态规划(递推求解)
题目地址:http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括 ...
- 分享一下个人的Vim配置文件
强烈拥护开源精神,高举开源大旗,今天我就分享下我自己结合网上还有自己实际使用配的vimrc,可以给各位参考下,不要见笑哈,具体说明我在rc里写的也很详细,可以具体看下,也希望可以借这个机会能多认识认识 ...