着色方案(动态规划+记忆化搜索)

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1079

AC代码:

 1 /*
 2     直接状态压缩是显然是不可行的,我们考虑如果没有相邻颜色不相同的限制的话,
 3     如果两种油漆能染的木块数目相同,我们就可以认为两种油漆无差别。
 4     设dp[a1][a2][a3][a4][a5]为能染1个木块的油漆有a1种……的方案数。
 5     但是有相邻颜色的限制,如果上一次用了颜色数为k的油漆,
 6     那么这一次有一种颜色数为k-1的油漆就不能用了,转移的时候注意一下。
 7 */
 8 # include <iostream>
 9 # include <stdio.h>
10 # include <string.h>
11 # include <algorithm>
12 # include <bitset>
13 # include <ctime>
14 # include <climits>
15 # include <set>
16 # include <map>
17 # include <cctype>
18 # include <cmath>
19 # include <deque>
20 # include <queue>
21 # include <stack>
22 # include <vector>
23 # include <functional>
24 using namespace std;
25
26 typedef long long LL;
27 const int maxn=16;
28 const LL mod=1e9+7;
29 int n, x[16];
30 LL f[16][16][16][16][16][6];///f数组表示当前有能涂1次的油漆a个,能涂2次的b个....前一个涂的是还能涂k次的油漆
31 bool dp[16][16][16][16][16][6];
32
33 LL Dp(int a, int b, int c, int d, int e, int k)
34 {
35     LL t=0;
36     if( dp[a][b][c][d][e][k] )
37         return f[a][b][c][d][e][k];
38     if( a+b+c+d+e==0 )
39         return 1;
40     if( a )
41         t = t+(a-(k==2))*Dp(a-1, b, c, d, e, 1);///一种可以染1个方块的颜色,变成了可以染0个方块(所以a-1),如果上一次用了颜色数为2的油漆, 那么这一次有一种颜色数为1的油漆就不能用了
42     if( b )
43         t = t+(b-(k==3))*Dp(a+1, b-1, c, d, e, 2);///一种可以染2个方块的颜色,变成了可以染1个方块(所以b-1, a+1),如果上一次用了颜色数为3的油漆, 那么这一次有一种颜色数为2的油漆就不能用了
44     if( c )
45         t = t+(c-(k==4))*Dp(a, b+1, c-1, d, e, 3);///一种可以染3个方块的颜色,变成了可以染2个方块(所以c-1, b+1),如果上一次用了颜色数为4的油漆, 那么这一次有一种颜色数为3的油漆就不能用了
46     if( d )
47         t = t+(d-(k==5))*Dp(a, b, c+1, d-1, e, 4);///一种可以染4个方块的颜色,变成了可以染3个方块(所以d-1, c+1),如果上一次用了颜色数为5的油漆, 那么这一次有一种颜色数为4的油漆就不能用了
48     if( e )
49         t = t+e*Dp(a, b, c, d+1, e-1, 5);///一种可以染5个方块的颜色,变成了可以染4个方块(所以e-1, d+1),如果这一次用可以染5个方块的颜色,因为题目有条件1 <= ci <= 5,所以说明他之前一定没用过
50     dp[a][b][c][d][e][k] = 1;
51     return f[a][b][c][d][e][k] = (t%mod);
52 }
53
54 int main()
55 {
56     scanf("%d", &n);
57     for(int i=1; i<=n; i++)
58     {
59         int y;
60         scanf("%d", &y);
61         x[y]++;
62     }
63     printf("%lld\n", Dp(x[1], x[2], x[3], x[4], x[5], 0));
64     return 0;
65 }

原文地址:https://www.cnblogs.com/wsy107316/p/11330732.html

时间: 2024-10-09 23:19:04

着色方案(动态规划+记忆化搜索)的相关文章

sicily 1176. Two Ends (Top-down 动态规划+记忆化搜索 v.s. Bottom-up 动态规划)

DescriptionIn the two-player game "Two Ends", an even number of cards is laid out in a row. On each card, face up, is written a positive integer. Players take turns removing a card from either end of the row and placing the card in their pile. T

Codevs_1017_乘积最大_(划分型动态规划/记忆化搜索)

描述 http://codevs.cn/problem/1017/ 给出一个n位数,在数字中间添加k个乘号,使得最终的乘积最大. 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友

动态规划①——记忆化搜索

首先的首先,必须明白动态规划(DP)以后很有用很有用很有用很有用……首先的其次,必须明白:动规≍搜索=枚举 一.最简单的记忆化搜索(应该可以算DP) 题目(来自洛谷OJ)http://www.luogu.org/problem/show?pid=1434# [不麻烦大家自己找了]题目描述 DescriptionMichael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最

[BJOI2012]最多的方案(记忆化搜索)

第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数.现在给一个正整数N,它可以写成一些斐波那契数的和的形式.如果我们要求不同的方案中不能有相同的斐波那契数,那么对一个N最多可以写出多少种方案呢? 题意是说数列中不能出现相同的数. 显然要记忆化搜索. 直接搜会T,我们枚举下一个数填什么是要从大到小枚举,可以使效率有指数级的提升. 这是枚举上界,枚举下界可以用前缀和+二分来优化枚举复杂度. 加了这两个优化后代

UVA_437_The_Tower_of_the_Babylon_(DAG上动态规划/记忆化搜索)

描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=378 n种方块,给出每一种的长宽高,现在要落起来,上面的方块的长和宽要严格小于下面的方块,问最多落多高. ACM Contest Problems ArchiveUniversity of Valladolid (SPAIN)437 The Tower of BabylonPerhap

动态规划-记忆化搜索

1.数字三角形 学习链接:http://blog.csdn.net/zwhlxl/article/details/46225947 输入样例: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输出样例: 30 递归代码: #include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <

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

1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1079 Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的

hdu 1978 How many ways (动态规划、记忆化搜索)

How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2957    Accepted Submission(s): 1733 Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并

算法导论学习-动态规划之记忆化搜索

一. 动态规划 动态规划(dynamic programming),与“分治思想”有些相似,都是利用将问题分 为子问题,并通过合并子问题的解来获得整个问题的解.于“分治”的不同之处在 于,对于一个相同的子问题动态规划算法不会计算第二次,其实现原理是将每一个计算过的子问题的值保存在一个表中. 二. 记忆化搜索 我们常见的动态规划问题,比如流水线调度问题,矩阵链乘问题等等都是“一步接着一步解决的”,即规模为 i 的问题需要基于规模 i-1 的问题进行最优解选择,通常的递归模式为DP(i)=optim