BZOJ1079或洛谷2476 [SCOI2008]着色方案
一道记忆化搜索
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]着色方案的更多相关文章
- 洛谷 2476 [SCOI2008]着色方案
50%的数据满足:1 <= k <= 5, 1 <= ci <= 3 100%的数据满足:1 <= k <= 15, 1 <= ci <= 5 [题解] ...
- bzoj1079: [SCOI2008]着色方案
ci<=5直接想到的就是5维dp了...dp方程YY起来很好玩...写成记忆化搜索比较容易 #include<cstdio> #include<cstring> #inc ...
- BZOJ 1079: [SCOI2008]着色方案 记忆化搜索
1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- bzoj 1079: [SCOI2008]着色方案 DP
1079: [SCOI2008]着色方案 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 803 Solved: 512[Submit][Status ...
- 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码
洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...
- [SCOI2008]着色方案
1079: [SCOI2008]着色方案 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2228 Solved: 1353[Submit][Stat ...
- [SCOI2008] 着色方案[高维dp]
321. [SCOI2008] 着色方案 ★★★ 输入文件:color.in 输出文件:color.out 简单对比时间限制:1 s 内存限制:64 MB 题目背景: 有n个木块排成一 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- BZOJ1079 [SCOI2008]着色方案 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1079 题目概括 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的 ...
随机推荐
- 学JS的心路历程-闭包closure
闭包是是纯函式语言的一个特性,也是JS的一个关键性的特色,虽然不了解也能开发程序,但我们不是这种人对吧? 闭包不仅可以减少某些高阶功能的代码数量和复杂度,并且可以让我们做到原本无法做的复杂功能.听到这 ...
- Html----编写
文档的编辑 选择文档---->修改文档后缀名(.thml)--->用浏览器打开(解释和执行HTML源代码的工具) 浏览器主要分类及内核 火狐(Firefor)--->Gecho IE ...
- linux centos 基本命令
init 3 进入命令行界面. init 5 进入图形界面. ifconfig 查询IP地址. nmtui 设置网卡. su - root 是切换到root账号使用,使用的是root用户的环境变量:s ...
- Flux architecture
[Flux architecture] Flux is a pattern for managing data flow in your application. The most important ...
- 创建java项目思路
一.搭建 1.创建搭建项目 2.创建分层 二.理解项目(理清总体思路) 1.是否有共同部分(过滤或者拦截) 常用量 (static) 2.搭建单表基本增(是否需要返回值) 删(条件) 查(条 ...
- JMeter学习(六)检查点(转载)
转载自 http://www.cnblogs.com/yangxia-test JMeter也有像LR中的检查点,本篇就来介绍下JMeter的检查点如何去实现. JMeter里面的检查点通过添加断言来 ...
- maven开发工具安装
Maven安装并测试步骤: 1.下载并解压meaven.zip: 2.配置环境变量“M2_HOME”指向meaven安装目录: 3.添加“%M2_HOME%\bin;”到path环境变量中: 4.测试 ...
- android 区分wifi是5G还是2.4G(转)
http://bbs.csdn.net/topics/391033966?page=1 我一开始看这帖子,找不到答案,为了后来的人,我来回复吧.WifiManager wifiManager = (W ...
- CentOS 下搭建Jenkins
1.下载安装包 A 可以连接外网: 导入仓库 wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/jen ...
- leecode 937 Reorder Log Files (模拟)
传送门:点我 You have an array of logs. Each log is a space delimited string of words. For each log, the ...