相邻色块不同的着色方案,似乎这道题已经见过3个版本了。
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
1 <= k <= 15,,1 <= ci <= 5。
Solution
k和ci都这么小,状压肯定没跑了。
如果你把k和ci的数据范围换一换,你应该会很容易地设计出状态吧。
我们先试着从5^15的状态表示法入手,看看有什么可改进的地方。
你会发现有很多状态本质上是一样的,颜色之间其实是没有区别的。
例如七种颜色的数量{1,4,3,2,2,1,2}和{1,2,3,2,4,2,1}排序后都是{1,1,2,2,2,3,4}。
所以我们就试着把状态压一压,状态表示为当前每种数量的颜色有多少种。
这样就状态又变成15^5啦,科学得不要不要的。
具体状态为f[i][j][k]表示已经涂了i格,状态为j,最后一格涂的是在当前状态中数量为k的颜色,转移自己看着办吧。
时间复杂度O(n*k^ci*ci^2),记忆化搜索似乎会省掉那个n?(n=Σci)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MN 1100005
#define mod 1000000007
using namespace std;
int m,n,S;
int g[],ys[],f[][MN][],q[][MN],tp[];
bool u[MN]; inline int read()
{
int n=,f=; char c=getchar();
while (c<'' || c>'') {if(c=='-')f=-; c=getchar();}
while (c>='' && c<='') {n=n*+c-''; c=getchar();}
return n*f;
} inline void rw(int &x,int y) {x+=y; if (x>=mod) x-=mod;} int main()
{
register int x,i,j,k,l,lg,rg,gs;
for (m=read();m--;) ++g[x=read()],n+=x;
for (ys[]=,i=;i<=;++i) ys[i]=ys[i-]<<;
for (i=;i<=;++i) S+=g[i]*ys[i];
for (f[][q[][tp[]=]=S][]=,lg=,rg=,i=;i<n;++i,swap(lg,rg))
{
tp[rg]=;
for (j=;j<=tp[lg];++j) if (!u[q[lg][j]])
for (u[q[lg][j]]=true,k=;k<;f[lg][q[lg][j]][k++]=) if (f[lg][q[lg][j]][k])
for (x=q[lg][j],l=;l;x%=ys[l--]) if (gs=x/ys[l])
if (k!=l)
rw(f[rg][q[lg][j]-ys[l]+ys[l-]][l-],1LL*f[lg][q[lg][j]][k]*gs%mod),
q[rg][++tp[rg]]=q[lg][j]-ys[l]+ys[l-];
else if (gs>)
rw(f[rg][q[lg][j]-ys[l]+ys[l-]][l-],1LL*f[lg][q[lg][j]][k]*(gs-)%mod),
q[rg][++tp[rg]]=q[lg][j]-ys[l]+ys[l-];
for (j=;j<=tp[lg];++j) u[q[lg][j]]=false;
}
printf("%d",f[lg][][]);
}
Last Word
世界上还有比恶意散播题解的更毒的人吗?
[BZOJ]1079 着色方案(SCOI2008)的更多相关文章
-
Bzoj 1079 着色方案 题解
1079: [SCOI2008]着色方案 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2237 Solved: 1361[Submit][Stat ...
-
bzoj 1079 着色方案
题目: 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其 中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即c1+c2+-+ck=n.相邻两个木块涂相同色显得 ...
-
BZOJ 1079 着色方案(DP)
如果把当前格子涂什么颜色当做转移的话,状态则是每个格子的颜色数还剩多少,以及上一步用了什么颜色,这样的状态量显然是5^15.不可取. 如果把当前格子涂颜色数还剩几个的颜色作为转移的话,状态则是每个格子 ...
-
BZOJ 1079: [SCOI2008]着色方案 记忆化搜索
1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
-
bzoj 1079: [SCOI2008]着色方案 DP
1079: [SCOI2008]着色方案 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 803 Solved: 512[Submit][Status ...
-
BZOJ 1079: [SCOI2008]着色方案(巧妙的dp)
BZOJ 1079: [SCOI2008]着色方案(巧妙的dp) 题意:有\(n\)个木块排成一行,从左到右依次编号为\(1\)~\(n\).你有\(k\)种颜色的油漆,其中第\(i\)种颜色的油漆足 ...
-
【BZOJ】1079: [SCOI2008]着色方案(dp+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1079 只能想到5^15的做法...........................果然我太弱. 其实 ...
-
【BZOJ 1079】[SCOI2008]着色方案
Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木 ...
-
[BZOJ 1079][SCOI 2008]着色方案
1079: [SCOI2008]着色方案 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2237 Solved: 1361[Submit][Stat ...
随机推荐
-
canvas学习之制作动画
html部分 ...... <body> <canvas id="myCanvas" width="400" height="400 ...
-
学习K&;R时初学者经常遇到的一个问题——EOF
学习K&R时初学者经常遇到的一个问题——EOF
-
linux shell中,单引号、 双引号,反引号(``),$()的区别
一.单引号和双引号 首先,单引号和双引号,都是为了解决中间有空格的问题. 空格在linux中时作为一个很典型的分隔符,比如 string1=this is a string,这样执行会报错.为了避免这 ...
-
Android开发_字符串处理类-TextUtils类
对于字符串处理Android为我们提供了一个简单实用的TextUtils类,如果处理比较简单的内容不用去思考正则表达式不妨试试这个在android.text.TextUtils的类,主要的功能如下: ...
-
BZOJ3439: Kpm的MC密码
3439: Kpm的MC密码 Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 166 Solved: 79[Submit][Status] Descr ...
-
MYSQL 的 3 类数据类型
1.数据型: bool,float,double decimal(M,D) M是小数位数(精度)的总数,D是小数点(标度)后面的位数.DECIMAL整数最大位数(M)为65. smallint 小的整 ...
-
最短路径Shortest Path algorithm
最短路径问题: 如果从图中某一顶点(称为端点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小. (1)Dijkstra 算法 (2) Floyd 算 ...
-
hdu1693 插头dp
题意:给了一个矩阵图,要求使用回路把图中的树全部吃掉的方案树,没有树的点不能走,吃完了这个点也就没有了,走到哪吃到哪 用插头dp搞 #include <iostream> #include ...
-
[C#] LINQ之GroupBy
声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 本文作者文采欠佳,文字表达等方面不是很好,但实际的代码例子是非常实用的,请作参考. 一.先准备要使用的类: 1.Person类: cl ...
-
Vue(十八)Element UI
Elment UI 1. 简介 Element UI是饿了么团队提供的一套基于Vue2.0的组件库,可以快速搭建网站,提高开发效率 ElementUI PC端 MintUI 移动端 [官网](http ...