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与记忆化搜索结合在了一起……
  我们做一个假设,假设ci都为1,那么这就是一道状压题了,但是ci<=5,虽然仍然不大,但是状压15位显然扑街。
  让我们回过头在看最基础的暴力,也就是我们去枚举每一位放的颜色,并将它传递给下一层dfs,如果我们分析一下的话我们会发现每一种剩下可涂数量相同的颜色都可以看作等价的,换句话说涂谁都行。那么,我们将状压的方式换一换,不对,不能叫状压了。改为ci剩余1 2 3 4 5 个的颜色有几种,上一个是谁,也就是f[15][15][15][15][15][7]。空间没问题,至于转移,我们利用dfs的思想,使用记忆化搜索,然后对于每一个f,假设当前状态为f[a][b][c][d][e][la]
  则若d!=0且la!=3那么f[a][b][c][d][e][la]+=f[a][b][c][d-1][e+1][2]*d。
  若la=3那么f[a][b][c][d][e][la]+=(d-1)*f[a][b][c][d-1][e+1][2]。
  其余同理。
  不得不说转移数组挺像一道概率DP“抵制克苏恩”的,可惜没有能够应用到这道题来啊。
 #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
int n,t,a[],js[];
long long f[][][][][][],p=;
bool vi[][][][][][];
long long dfs(int a,int b,int c,int d,int e,int la)
{
     
    if(a==&&b==&&c==&&d==&&e==)return ;
    if(vi[a][b][c][d][e][la])return f[a][b][c][d][e][la];
    vi[a][b][c][d][e][la]=;
    if(a)f[a][b][c][d][e][la]+=a*dfs(a-,b+,c,d,e,),f[a][b][c][d][e][la]%=p;
    if(b)
    {
        if(b!=)f[a][b][c][d][e][la]+=(b-(la==))*dfs(a,b-,c+,d,e,);
        else if(la!=)f[a][b][c][d][e][la]+=dfs(a,b-,c+,d,e,);
        f[a][b][c][d][e][la]%=p;
    }
    if(c)
    {
        //cout<<a<<' '<<b<<' '<<c<<' '<<d<<' '<<e<<endl;
        if(c!=)f[a][b][c][d][e][la]+=(c-(la==))*dfs(a,b,c-,d+,e,);
        else if(la!=) f[a][b][c][d][e][la]+=dfs(a,b,c-,d+,e,);
        f[a][b][c][d][e][la]%=p;
    }
    if(d)
    {
         
        if(d!=)f[a][b][c][d][e][la]+=(d-(la==))*dfs(a,b,c,d-,e+,);
        else if(la!=)f[a][b][c][d][e][la]+=dfs(a,b,c,d-,e+,);
        f[a][b][c][d][e][la]%=p;
    }
    if(e)
    {
        if(e!=)f[a][b][c][d][e][la]+=(e-(la==))*dfs(a,b,c,d,e-,);
        else if(la!=)f[a][b][c][d][e][la]+=dfs(a,b,c,d,e-,);
        f[a][b][c][d][e][la]%=p;
    }
    return f[a][b][c][d][e][la];
}
int main()
{
    scanf("%d",&t);
    for(int i=;i<=t;i++)
    {
        scanf("%d",&a[i]);
        n+=a[i];
        js[a[i]]++;
    }
    long long ans=dfs(js[],js[],js[],js[],js[],);
    printf("%lld\n",ans);
    return ;
}

  顺便提一句,我之所以还要多开一个vi数组,是为了防止f模p之后为0的情况。

Bzoj 1079 着色方案 题解的更多相关文章

  1. [BZOJ]1079 着色方案(SCOI2008)

    相邻色块不同的着色方案,似乎这道题已经见过3个版本了. Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够 ...

  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)

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

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

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

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

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

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

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

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

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

随机推荐

  1. SQL Server 事务复制分发到订阅同步慢

    原文:SQL Server 事务复制分发到订阅同步慢 最近发现有一个发布经常出现问题,每几天就出错不同步,提示要求初始化.重新调整同步后,复制还是很慢!每天白天未分发的命令就达五六百万条!要解决慢的问 ...

  2. PostgreSQL在win7上安装详细步骤

    原文:PostgreSQL在win7上安装详细步骤 PostgreSQL安装: 一.windows下安装过程 安装介质:postgresql-9.1.3-1-windows.exe(46M),安装过程 ...

  3. sql语句查询重复值

    select * from user where name in (select name from user group by name having count(*)>1)

  4. Windows Phone Launcher class

    Starts the default app associated with the specified file or URI. Launch a file contained in the app ...

  5. C#命名约定

    推荐的标识命名风格 风格名称 描述 使用建议 示例 Pascal大小写 标识符中每个单词都首字母大写 用于类型名和成员名 CarDeck, DealersHand Camel大小写 除第一个单词以外, ...

  6. WCF研究-后篇

    最后就对之前的资料进行整理以及在其他博客园的朋友那看到的资料稍微分享一下,这样有助于学习和使用WCF的朋友更好的学习和理解WCF 后期要是看到合适的资料也会再次编辑这个后篇,让我共同进步! 后篇 1. ...

  7. 初探 C# 8 的 Nullable Reference Types

    溫馨提醒:本文提及的 C# 8 新功能雖已通過提案,但不代表將來 C# 8 正式發布時一定會納入.這表示我這篇筆記有可能白寫了,也表示您不必急著瞭解這項新功能的所有細節,可能只要瞄一下底下的「概要」說 ...

  8. C++界面库(十几种,很全)

    刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG  Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自 ...

  9. 每天进步一点--WCF学习笔记

    最近买了一本书WCF服务编程,重头再开始了解学习WCF,现将学习记录,以便后来复习,也希望和大家一起进步. WCF用终结点表示一种组成关系,终结点就是地址.契约与绑定的混合品,即 地址(Address ...

  10. Python 爬虫从入门到进阶之路(七)

    在之前的文章中我们一直用到的库是 urllib.request,该库已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Hum ...