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

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

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

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

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

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

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

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

  7. 【BZOJ】1079: [SCOI2008]着色方案(dp+特殊的技巧)

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

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

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

  9. [BZOJ 1079][SCOI 2008]着色方案

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

随机推荐

  1. android 检查软件是否有更新版本

    import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import com.yuxin.m ...

  2. JAVA_SE基础——52.匿名内部类

    电信的电箱烧了,害我断了2天网,真拿命,耽误了 Java匿名内部类的总结: 没有名字的内部类.就是内部类的简化形式.一般只用一次就可以用这种形式.匿名内部类其实就是一个匿名子类对象.想要定义匿名内部类 ...

  3. Mac使用brew安装软件

    Homebrew官方网站:https://brew.sh/1,安装brew,Mac中打开Termal输入命令: /usr/bin/ruby -e "$(curl -fsSL https:// ...

  4. C语言使用vs2013进行编辑

    由于vs2013是微软开发的产品所以在windows平台下无限兼容windows所有虽然比较大,但是还是比较值得 但是在运行C程序的遇到问题就是控制台一闪而过通过ctrl+F5执行也是不管用: #in ...

  5. Mysql编译安装详解

    wget http://mirrors.cnnic.cn/apache/httpd/mysql-5.5.20.tar.gz root@Mysql-server ~]# yum install -y c ...

  6. 文本分类学习(三) 特征权重(TF/IDF)和特征提取

    上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...

  7. 配置ssh无密钥登陆

    ssh 无密码登录要使用公钥与私钥. linux下可以用用ssh-keygen生成公钥/私钥对,下面以CentOS为例. 有机器LxfN1(192.168.136.128),LxfN2(192.168 ...

  8. [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?

    其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...

  9. Hibernate(二):MySQL server version for the right syntax to use near 'type=InnoDB' at line x

    目前使用的hibernate5.2.9版本,配置的mysql方言为: <property name="hibernate.dialect">org.hibernate. ...

  10. global与nonlocal关键字总结

    global适用于函数内部修改全局变量的值 nonlocal适用于嵌套函数中内部函数修改外部变量的值 如果没有使用以上关键字,对全局变量或者外部变量进行修改,python会默认将全局变量隐藏起来 例1 ...