[SCOI2008]着色方案(DP)

题目链接

思想

显然我们后面的决策是跟前一步相关的,因此我们可以考虑DP,可以用一个15维的数组来进行转移,但是这样显然回mle,所以我们考虑如何压缩状态,由于1<=Ci<=51 <= C_i <= 51<=Ci<=5,所以我们可以有dp数组:
dp[a1][a2][a3][a4][a5][last]dp[a_1][a_2][a_3][a_4][a_5][last]dp[a1][a2][a3][a4][a5][last]a1a_1a1表示可以涂1块木块的有多少种颜色,以此类推,lastlastlast表示上一次用的是可以涂lastlastlast个木块的颜色。

接下来就是考虑dp方程的转移了。
举个例子:
假设上一次用的颜色是可以涂5个块的,那么下一步的状态转移就会变成:
sum=a1∗dp[a1−1][a2][a3][a4][a5][1]+a2∗dp[a1+1][a2−1][a3][a4][a5][2]+a3∗dp[a1][a2+1][a3−1][a4][a5][3]+(a4−1)∗dp[a1][a2][a3+1][a4−1][a5][4]+a5∗dp[a1][a2][a3][a4+1][a5−1][5]sum = a_1 * dp[a_1 - 1][a2][a3][a_4][a_5][1] + a_2 * dp[a_1 + 1][a_2 - 1][a_3][a_4][a_5][2] + a_3 * dp[a_1][a_2 + 1][a_3 - 1][a_4][a_5][3] + (a4 - 1) * dp[a_1][a_2][a_3 + 1][a_4 - 1][a_5][4] + a5 * dp[a_1][a_2][a_3][a_4 + 1][a_5 - 1][5]sum=a1dp[a11][a2][a3][a4][a5][1]+a2dp[a1+1][a21][a3][a4][a5][2]+a3dp[a1][a2+1][a31][a4][a5][3]+(a41)dp[a1][a2][a3+1][a41][a5][4]+a5dp[a1][a2][a3][a4+1][a51][5]

之所以a4−1a_4 - 1a41是因为,上一步选的是5,所以转移过来的时候a4+1a_4 + 1a4+1,这里面有一个是跟上一个块同颜色的,所以需要减去,其他情况同理。

考虑到数据比较小,并且这个dp方程有点难转移,因此我们可以考虑用记忆化搜索来进行dp转移。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int mod = 1e9 + 7;ll dp[20][20][20][20][20][10];
int n, a[10];ll dfs(int a1, int a2, int a3, int a4, int a5, int last) {if(dp[a1][a2][a3][a4][a5][last]) return dp[a1][a2][a3][a4][a5][last];ll ans = 0;if(a1) ans = (ans + 1ll * (a1 - (last == 2)) * dfs(a1 - 1, a2, a3, a4, a5, 1)) % mod;if(a2) ans = (ans + 1ll * (a2 - (last == 3)) * dfs(a1 + 1, a2 - 1, a3, a4, a5, 2)) % mod;if(a3) ans = (ans + 1ll * (a3 - (last == 4)) * dfs(a1, a2 + 1, a3 - 1, a4, a5, 3)) % mod;if(a4) ans = (ans + 1ll * (a4 - (last == 5)) * dfs(a1, a2, a3 + 1, a4 - 1, a5, 4)) % mod;if(a5) ans = (ans + 1ll * a5 * dfs(a1, a2, a3, a4 + 1, a5 - 1, 5)) % mod;return dp[a1][a2][a3][a4][a5][last] = ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read();for(int i = 1; i <= n; i++) {int x = read();a[x]++;}for(int i = 1; i <= 5; i++) dp[0][0][0][0][0][i] = 1;print(dfs(a[1], a[2], a[3], a[4], a[5], 0));return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创业周年记:召唤神龙一周年小记

2018年8月8日&#xff0c;我决定离开腾讯的光环&#xff0c;辞职开始创业。《回顾4180天在腾讯使用C#的历程&#xff0c;开启新的征途》记录了我所说的拥有七龙珠&#xff0c;去召唤神龙&#xff0c;今天正好历时一年时间&#xff0c;非常有必要来回顾过去一年的创业历程。迎接…

1285. 单词 ac自动机 + fail树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 一篇论文由若干单词构成&#xff0c;且单词间是隔开的&#xff0c;给你nnn个单词&#xff0c;要求你计算每个单词在论文中出现了多少次。 1≤n≤2001\le n\le 2001≤n≤200&#xff0c;所有单词总长不超过1e…

Bitset瞎搞

Bitset字符匹配 Regular Number /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h> #define mp make_pair #define pb push_back #define endl \nusing namespace std;typedef long long ll; typedef unsigned long lo…

「数据ETL」从数据民工到数据白领蜕变之旅(三)-除了Excel催化剂之外PowerQuery新物种同样值得期待...

在自助式BI时代以前&#xff0c;Excel级别的数据ETL工作&#xff0c;非常低效&#xff0c;动不动就要启用VBA来完成一些常见的需求&#xff0c;自带的原生功能&#xff0c;未能满足大量的繁琐数据ETL刚需功能。在Excel2010后&#xff0c;PowerQuery以插件的形式横空出现&#x…

Codeforces Round #743 (Div. 2) D. Xor of 3 模拟 + 构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个010101序列aaa&#xff0c;定义一次操作是选择一个[1,n−2][1,n-2][1,n−2]范围内的下表&#xff0c;将ai,ai1,ai2a_i,a_{i1},a_{i2}ai​,ai1​,ai2​都变成ai⊕ai1⊕ai2a_i\oplus a_{i1} \oplus a_…

Docker系列之烹饪披萨(二)

上一篇我们讲解了虚拟机和容器的区别&#xff0c;本节我们来讲讲Docker中关于Dockerfile、镜像、容器等基本概念。Docker是一个在容器内开发、部署、运行应用程序的平台&#xff0c;Docker本质上是容器化的代名词&#xff0c;容器对于提高软件开发和数据科学的安全性&#xff0…

线段树平方和板子

题目测试链接 代码 /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h> #define mp make_pair #define pb push_back #define endl \n #define mid (l r >> 1) #define lson rt << 1, l, mid #define rson…

Codeforces Round #743 (Div. 2) E. Paint 区间dp + 暴力

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个有nnn个像素的图像&#xff0c;每个像素都有一个颜色aia_iai​&#xff0c;保证每种颜色的图像不会超过202020个。你现在每次可以选择一个颜色&#xff0c;并选择一段连续的像素&#xff0c;要求连续…

史上最能“拜客户教”的公司,是如何做到持续交付的?(第2趴)|DevOps案例研究...

内容来源&#xff1a;DevOps案例深度研究 –Amazon持续交付之道战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;更多细节请关注案例分享会&#xff0c;及本公众号。&#xff09;本案例内容贡献者&#xff1a;单冰 (Topic Leader)、 赵栋、梁兴龙、李杰、毛艳清、牛恒…

C 简单瞎搞题(牛客练习赛22)(bitset优化dp)

Bitset优化Dp 题目链接 一般DP做法 显然后面的数是与前面的数字相关的&#xff0c;所以我们有dp数组&#xff0c;dp[i][j]dp[i][j]dp[i][j]选取了jjj个数&#xff0c;iii是否可以被创造出来&#xff0c;如果可以其值为1&#xff0c;否则为0。 所以我们显然有如下的状态转移…

AtCoder Regular Contest 125

传送门 A−DialUpA-Dial UpA−DialUp 贪心贪心贪心 首先当bbb有aaa没有的元素的时候显然无解&#xff0c;否则我们可以找到离a1a_1a1​最近的一个!a1!a_1!a1​&#xff0c;让后交替着来构造bbb即可。 int n,m; int a[N],b[N];int main() { // ios::sync_with_stdio(false); /…

ASP.NET Core on K8S深入学习(3)Deployment

上一篇《部署过程解析与安装Dashboard》中我们了解K8S的部署过程&#xff0c;这一篇我们来了解一下K8S为我们提供的几种应用运行方式&#xff1a;Deployment、DaemonSet与Job&#xff0c;它们是Kubernetes最重要的核心功能提供者。考虑到篇幅和更新速度&#xff0c;我将其分为两…

Codeforces Round #742 (Div. 2) F. One-Four Overload 构造 + 二分图染色

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个n∗mn*mn∗m的矩形&#xff0c;包含...和XXX&#xff0c;你有两种颜色&#xff0c;你需要给...染色使得每个XXX上下左右相邻的...其两种颜色个数相同&#xff0c;输出一种合法方案。 1≤n,m≤5001\l…

同余最短路(P3403 跳楼机)

同余最短路 前置 给定m个数&#xff0c;这m个数可以重复取&#xff0c;问最大的这m个数不能拼成的数&#xff0c;或者给定一定范围&#xff0c;范围里有多少个数是这m个数可以拼成的&#xff0c;对于这种问题我们可以考虑同余最短路的算法。 P3403 跳楼机 同余最短路介绍 …

8月语言排行:C#继续呈现增长态势

TIOBE 编程语言排行榜 8 月更新已公布&#xff0c;排名前十的分别是&#xff1a;Java, C, Python, C, C#, Visual Basic .NET, JavaScript, PHP, Objective-C 和 SQL。和上个月唯一的不同之处在于 Objective-C 和 SQL 的排名发生了交换。事实上&#xff0c;上周 Dice Insights …

Codeforces Round #538 (Div. 2) F. Please, another Queries on Array? 线段树 + 欧拉函数

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个序列aaa&#xff0c;你需要实现两种操作&#xff1a; (1)(1)(1) 将[l,r][l,r][l,r]的aia_iai​都乘rrr。 (2)(2)(2) 求ϕ(∏ilrai)mod1e97\phi(\prod_{il}^ra_i)\bmod 1e97ϕ(∏ilr​ai​)mod1e97 1…

P2662 牛场围栏(同余最短路)

P2662 牛场围栏 思路 假设我们已经知道同余最短路是什么了&#xff0c;这里就不再过多赘述。 我们要尽可能地得到更多地课建成地边&#xff0c;那么我们必然要选一个basebasebase相对小的&#xff0c;因此我们可以对所有的棍子排个序&#xff0c;然后取a[1]−ma[1] - ma[1]−…

面试必谈的哈希,.Net 程序员温故而知新

引言&#xff1a;作为资深老鸟&#xff0c;有事没事&#xff0c;出去面试&#xff1b;找准差距、定位价值。面试必谈哈希&#xff0c;Q1&#xff1a;什么是哈希?Q2&#xff1a;哈希为什么快?Q3&#xff1a;你是怎么理解哈希算法利用空间换取时间的&#xff1f;Q4&#xff1a;…

P3804 【模板】后缀自动机 (SAM)

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个字符串sss&#xff0c;让你求sss中出现次数不为111的子串出现次数乘上该字串长度最大值。 ∣s∣≤1e6|s|\le 1e6∣s∣≤1e6 思路&#xff1a; 没学明白&#xff0c;不多bbbbbb&#xff0c;把树建出…

Grpc Proto To Nuget Package 插件使用说明

Grpc Proto To Nuget Package 是一个 VS 插件&#xff08;支持 VS2019&#xff09;&#xff0c;目的是将基于 gRPC 的接口定义 .proto 文件一键转成 Nuget Package&#xff0c;然后发布到私有仓库上。下载最新 GrpcProtoToNugetPackageTemplate.zip ASP.NET 的项目模板&#xf…