[BZOJ]1079 着色方案(SCOI2008)

时间:2023-01-26 08:53:23

  相邻色块不同的着色方案,似乎这道题已经见过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)的更多相关文章

  1. Bzoj 1079 着色方案 题解

    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 着色方案&lpar;DP&rpar;

    如果把当前格子涂什么颜色当做转移的话,状态则是每个格子的颜色数还剩多少,以及上一步用了什么颜色,这样的状态量显然是5^15.不可取. 如果把当前格子涂颜色数还剩几个的颜色作为转移的话,状态则是每个格子 ...

  4. BZOJ 1079&colon; &lbrack;SCOI2008&rsqb;着色方案 记忆化搜索

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

  5. bzoj 1079&colon; &lbrack;SCOI2008&rsqb;着色方案 DP

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

  6. BZOJ 1079&colon; &lbrack;SCOI2008&rsqb;着色方案(巧妙的dp)

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

  7. 【BZOJ】1079&colon; &lbrack;SCOI2008&rsqb;着色方案(dp&plus;特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1079 只能想到5^15的做法...........................果然我太弱. 其实 ...

  8. 【BZOJ 1079】&lbrack;SCOI2008&rsqb;着色方案

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

  9. &lbrack;BZOJ 1079&rsqb;&lbrack;SCOI 2008&rsqb;着色方案

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

随机推荐

  1. canvas学习之制作动画

    html部分 ...... <body> <canvas id="myCanvas" width="400" height="400 ...

  2. 学习K&amp&semi;R时初学者经常遇到的一个问题——EOF

    学习K&R时初学者经常遇到的一个问题——EOF

  3. linux shell中,单引号、 双引号,反引号(&grave;&grave;),&dollar;&lpar;&rpar;的区别

    一.单引号和双引号 首先,单引号和双引号,都是为了解决中间有空格的问题. 空格在linux中时作为一个很典型的分隔符,比如 string1=this is a string,这样执行会报错.为了避免这 ...

  4. Android开发&lowbar;字符串处理类-TextUtils类

    对于字符串处理Android为我们提供了一个简单实用的TextUtils类,如果处理比较简单的内容不用去思考正则表达式不妨试试这个在android.text.TextUtils的类,主要的功能如下: ...

  5. BZOJ3439&colon; Kpm的MC密码

    3439: Kpm的MC密码 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 166  Solved: 79[Submit][Status] Descr ...

  6. MYSQL 的 3 类数据类型

    1.数据型: bool,float,double decimal(M,D) M是小数位数(精度)的总数,D是小数点(标度)后面的位数.DECIMAL整数最大位数(M)为65. smallint 小的整 ...

  7. 最短路径Shortest Path algorithm

    最短路径问题: 如果从图中某一顶点(称为端点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小. (1)Dijkstra 算法 (2) Floyd 算 ...

  8. hdu1693 插头dp

    题意:给了一个矩阵图,要求使用回路把图中的树全部吃掉的方案树,没有树的点不能走,吃完了这个点也就没有了,走到哪吃到哪 用插头dp搞 #include <iostream> #include ...

  9. &lbrack;C&num;&rsqb; LINQ之GroupBy

    声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 本文作者文采欠佳,文字表达等方面不是很好,但实际的代码例子是非常实用的,请作参考. 一.先准备要使用的类: 1.Person类: cl ...

  10. Vue(十八)Element UI

    Elment UI 1. 简介 Element UI是饿了么团队提供的一套基于Vue2.0的组件库,可以快速搭建网站,提高开发效率 ElementUI PC端 MintUI 移动端 [官网](http ...