当前位置: 首页 > news >正文

SCOI2008着色方案(记忆化搜索)

有n个木块排成一行,从左到右依次编号为1~n。你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块。所有油漆刚好足够涂满所有木块,即

c1+c2+...+ck=n。相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的着色方案。

Solution

有一个非常好的条件就是c[i]<=5,这样我们就可以设计状态为dp[1][2][3][4][5][la]表示有一个的有几种颜色,有两个的有几种颜色·····,上一次我们枚举的是哪里。

然后就愉快的记忆化搜索,注意要求相邻木块颜色不同的条件:例如我当前枚举1,如果我上一次枚举的二,那么有一个一我就不能选。

Code

#include<iostream>
#include<cstring>
#include<cstdio>
#define mod 1000000007
using namespace std;
typedef long long ll;
int dp[16][16][16][16][16][6],n,ji[9],x;
int dfs(int one,int sec,int thi,int fou,int fiv,int hea){
    if(~dp[one][sec][thi][fou][fiv][hea])return dp[one][sec][thi][fou][fiv][hea];
    long long ans=0;
    if(one)(ans+=((ll)one-(hea==1))*dfs(one-1,sec,thi,fou,fiv,0))%=mod;
    if(sec)(ans+=((ll)sec-(hea==2))*dfs(one+1,sec-1,thi,fou,fiv,1))%=mod;
    if(thi)(ans+=((ll)thi-(hea==3))*dfs(one,sec+1,thi-1,fou,fiv,2))%=mod;
    if(fou)(ans+=((ll)fou-(hea==4))*dfs(one,sec,thi+1,fou-1,fiv,3))%=mod;
    if(fiv)(ans+=(ll)fiv*dfs(one,sec,thi,fou+1,fiv-1,4))%=mod;
    return dp[one][sec][thi][fou][fiv][hea]=ans;
}
int main(){
    scanf("%d",&n);
    memset(dp,-1,sizeof(dp));
    for(int i=0;i<=5;++i)dp[0][0][0][0][0][i]=1; 
    for(int i=1;i<=n;++i)scanf("%d",&x),ji[x]++;
    printf("%d",dfs(ji[1],ji[2],ji[3],ji[4],ji[5],5));
    return 0;
}

 

转载于:https://www.cnblogs.com/ZH-comld/p/9814320.html

相关文章:

  • 高性能iOS应用开发(二):应用的生命周期
  • Blockathon(2018)上海竞赛项目成果今天揭晓
  • 版本
  • idea的安装和学生申请免费使用
  • Python自动化开发学习-爬虫2
  • hadoop最新发行稳定版:DKHadoop版本选择详解
  • 多路复用实现单服百万级别RPS吞吐
  • 1024,码出未来!
  • 实验5
  • Sql Server内置函数实现MD5加密
  • [Google Guava] 1.1-使用和避免null
  • 资源下载汇总
  • DevExpress第三方控件使用实例之ASPxPopupControl弹出子窗体
  • 如何修复无法启动的docker容器
  • html----h1-6标签
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • JavaScript HTML DOM
  • Javascript弹出层-初探
  • JS笔记四:作用域、变量(函数)提升
  • python3 使用 asyncio 代替线程
  • Vue2 SSR 的优化之旅
  • 百度小程序遇到的问题
  • 搭建gitbook 和 访问权限认证
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 利用jquery编写加法运算验证码
  • 前端设计模式
  • 如何学习JavaEE,项目又该如何做?
  • 入门到放弃node系列之Hello Word篇
  • 手写双向链表LinkedList的几个常用功能
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • (06)金属布线——为半导体注入生命的连接
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (独孤九剑)--文件系统
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十八)三元表达式和列表解析
  • (转)重识new
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .bat批处理出现中文乱码的情况
  • .NET6 命令行启动及发布单个Exe文件
  • .Net各种迷惑命名解释
  • [20150707]外部表与rowid.txt
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [bzoj1912]异象石(set)
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [Docker]十.Docker Swarm讲解
  • [ERROR] ocp-server-ce-py_script_start_check-4.2.1 RuntimeError: ‘tenant_name‘
  • [ffmpeg] av_opt_set 解析
  • [hdu1561] The more, The Better 【树形DP】
  • [hive] posexplode函数