一道记忆化搜索

BZOJ原题链接

洛谷原题链接

发现对于能涂木块数量一样的颜色在本质上是一样的,所以可以直接压在一个状态,而这题的数据很小,直接暴力开\(6\)维。

定义\(f[a][b][c][d][e][la]\),\(a\)表示能涂\(1\)个木块的颜色总数,\(b\)表示能涂\(2\)个木块的颜色总数,\(c,d,e\)同理,\(la\)表示上次涂的颜色是能涂\(la\)个木块的。

然后考虑状态转移。如果用能涂\(1\)个木块的颜色去涂,则状态由\((a-(la==2))*f[a-1][b][c][d][e][1]\)转移来,因为有\(a\)种颜色,每一种都可以涂,所以要乘上\(a\),但注意当前状态的\(la=2\)的情况,就是说这个状态是由可以涂\(2\)个木块的颜色转移过来的,这时原来能涂\(2\)个木块的颜色变成只能涂\(1\)个了,题目要求相邻木块不能涂同一颜色,所以要将\(a\)减去\(1\)。对于用能涂\(2\)个木块的颜色去涂,则状态由\((b-(la==3))*f[a+1][b-1][c][d][e][2]\)转移来,其他同理得。

显然使用记忆化搜索更好打。

#include<cstdio>
using namespace std;
typedef long long ll;
const int N = 16;
const int mod = 1e9 + 7;
ll f[N][N][N][N][N][6];
int co[6];
int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c<'0' || c>'9'; c = getchar())
p = (c == '-' || p) ? 1 : 0;
for (; c >= '0'&&c <= '9'; c = getchar())
x = x * 10 + (c - '0');
return p ? -x : x;
}
ll dp(int a, int b, int c, int d, int e, int la)
{
ll s = 0, &k = f[a][b][c][d][e][la];
if (k)
return k;
if (!(a | b | c | d | e))
return 1;
if (a)
s += 1LL * (a - (la == 2))*dp(a - 1, b, c, d, e, 1);
if (b)
s += 1LL * (b - (la == 3))*dp(a + 1, b - 1, c, d, e, 2);
if (c)
s += 1LL * (c - (la == 4))*dp(a, b + 1, c - 1, d, e, 3);
if (d)
s += 1LL * (d - (la == 5))*dp(a, b, c + 1, d - 1, e, 4);
if (e)
s += 1LL * e*dp(a, b, c, d + 1, e - 1, 5);
k = s % mod;
return k;
}
int main()
{
int i, n;
n = re();
for (i = 1; i <= n; i++)
co[re()]++;
printf("%lld", dp(co[1], co[2], co[3], co[4], co[5], 0));
return 0;
}

BZOJ1079或洛谷2476 [SCOI2008]着色方案的更多相关文章

  1. 洛谷 2476 [SCOI2008]着色方案

    50%的数据满足:1 <= k <= 5, 1 <= ci <= 3 100%的数据满足:1 <= k <= 15, 1 <= ci <= 5 [题解] ...

  2. bzoj1079: [SCOI2008]着色方案

    ci<=5直接想到的就是5维dp了...dp方程YY起来很好玩...写成记忆化搜索比较容易 #include<cstdio> #include<cstring> #inc ...

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

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

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

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

  5. 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码

    洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...

  6. [SCOI2008]着色方案

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

  7. [SCOI2008] 着色方案[高维dp]

    321. [SCOI2008] 着色方案 ★★★   输入文件:color.in   输出文件:color.out   简单对比时间限制:1 s   内存限制:64 MB 题目背景: 有n个木块排成一 ...

  8. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  9. BZOJ1079 [SCOI2008]着色方案 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1079 题目概括 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的 ...

随机推荐

  1. webpack相关配置

    cd 项目文件夹 npm init -y npm install jquery -S //生成node_modules 下载好jquery 创建webpack.config.js module.exp ...

  2. yii添加验证码 和重复密码

    <?phpnamespace frontend\models; use common\models\User;use yii\base\Model;use Yii; /** * Signup f ...

  3. platform_device module

    参考: http://www.wowotech.net/linux_kenrel/platform_device.html 1. platform_device 需要在注册 platform_driv ...

  4. 03_java基础(二)之jdk的安装与环境变量配置

    1.语言与机器语言 语言 : 通常说的语言其实就是人与人之间沟通的一种方式计算机编程语言: 可以看成是人与计算机之间交流的一种方式 C,C++,C#,PHP,Java等 2.Java语言的历史 是SU ...

  5. Java,JDK动态代理的原理分析

    1. 代理基本概念: 以下是代理概念的百度解释:代理(百度百科) 总之一句话:三个元素,数据--->代理对象--->真实对象:复杂一点的可以理解为五个元素:输入数据--->代理对象- ...

  6. js 事件event

    var EventUtil = { addHandler: function(element,type,handler){ if(element.addEventListener){ element. ...

  7. 数据库表字段,DEFAULT NULL与NOT NULL DEFAULT

    为什么要把字段设置成not null 呢? 1.空值是不占用空间的 2.mysql中的NULL其实是占用空间的,下面是来自于MYSQL官方的解释 “NULL columns require addit ...

  8. 网页性能优化:防止JavaScript、CSS阻塞浏览器渲染页面

    网页中引用的外部文件: JavaScritp.CSS 等常常会阻塞浏览器渲染页面.假设在 <head> 中引用的某个 JavaScript 文件由于各种不给力需要2秒来加载,那么浏览器渲染 ...

  9. 第二章 向量(f)归并排序

  10. 解决 HDFS 开发 java.lang.IllegalArgumentException: java.net.UnknownHostException: hadoop000

    出现这种问题多半是windows找不到linux主机所以在 这个路径下的hosts加上linux ip地址,主机名就可以了