[SCOI2008]着色方案 递推 记忆化搜索
我们发现 $c_{i}$ 和 $k$ 的规模非常小
我们还发现每种颜色的位置是不必知道的,只要这种颜色和相邻的颜色种类不同即可。
定义状态 $f[a][b][c][d][e][last]$,代表有 $a$ 个还可以放 1 个,$b$ 个可以放 2 个,$c$ 个可以放3个......上一个状态最后一个放的数是可以放 $last$ 个的种类。
考虑记忆化搜索:
$f[a][b][c][d][e][last]+=f[a-1][b][c][d][e][1]*(a-(last==2))$
考虑当前放可以放1个的颜色,那么可放的颜色种类为 $a$ 个,但如果上一个状态中的最后一个放的种类为 2 的话它对当前状态中 $a$ 会贡献1,那么我们就要将这个 1 剪掉,其余情况同理。
Code:
// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
typedef long long ll;
const int maxn=16;
const ll mod=1000000007;
using namespace std;
void setIO(string a){
freopen((a+".in").c_str(),"r",stdin);
}
ll f[maxn][maxn][maxn][maxn][maxn][6];
int t[maxn];
ll dp(int a,int b,int c,int d,int e,int last){
if(f[a][b][c][d][e][last]!=-1) return f[a][b][c][d][e][last];
if(a+b+c+d+e==0) return f[a][b][c][d][e][last]=1;
ll res=0;
if(a) res+=(a-(last==2))*dp(a-1,b,c,d,e,1)%mod;
if(b) res+=(b-(last==3))*dp(a+1,b-1,c,d,e,2)%mod;
if(c) res+=(c-(last==4))*dp(a,b+1,c-1,d,e,3)%mod;
if(d) res+=(d-(last==5))*dp(a,b,c+1,d-1,e,4)%mod;
if(e) res+=e*dp(a,b,c,d+1,e-1,5)%mod;
f[a][b][c][d][e][last]=res%mod;
return res%mod;
}
int main(){
//setIO("input");
memset(f,-1,sizeof(f));
int n,x;
cin>>n;
for(int i=1;i<=n;++i) {
cin>>x;
++t[x];
}
cout<<dp(t[1],t[2],t[3],t[4],t[5],0)-1;
return 0;
}
[SCOI2008]着色方案 递推 记忆化搜索的更多相关文章
- BZOJ1079 [SCOI2008]着色方案 【dp记忆化搜索】
题目 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+-+ck=n.相邻两个木块涂相同色显得很难看 ...
- 路径方案数_mod_SPFA_记忆化搜索_C++
本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易 ...
- HDU 3555 (递推&&记忆化)
#include<stdio.h> #include<string.h> #define max 25 typedef __int64 LL; LL dp[max][]; // ...
- BZOJ 1079: [SCOI2008]着色方案 记忆化搜索
1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- SCOI2008着色方案(记忆化搜索)
有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难 ...
- BZOJ1079: [SCOI2008]着色方案 (记忆化搜索)
题意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很 ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 动态规划——数字三角形(递归or递推or记忆化搜索)
动态规划的核心就是状态和状态转移方程. 对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值). 在这个 ...
- 由DAG到背包问题——记忆化搜索和递推两种解法
一.问题描述 物品无限的背包问题:有n种物品,每种均有无穷多个.第 i 种物品的体积为Vi,重量为Wi.选一些物品装到一个容量为 C 的背包中,求使得背包内物品总体积不超过C的前提下重量的最大值.1≤ ...
随机推荐
- CoreData 从入门到精通(六)模型版本和数据迁移
前面几篇文章中讲的所有内容,都是在同一个模型版本上进行操作的.但在真实开发中,基本上不会一直停留在一个版本上,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模 ...
- javascript系列-class5.数组
转载请标明出处! 栈堆结构: 堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除. 栈:存放的是路径:容量有限(在一开始被定义之后就不会改变了): ...
- (转载)ScratchView
首页 我的管理 客户端 登录注册 首页 安卓组件中心 安卓代码分享 Swift专区 HTML5移动开发 视频中心 小程序 名称: ScratchView 作者: doliangzhe 来源: gith ...
- 乌班图 之 设置镜像服务器 、设置屏幕分辨率QAQ
设置镜像服务器 Ubuntu 中的大部分软件安装都是用apt命令,从Ubuntu的服务器上直接安装的. 但是国外你懂的网速是硬伤,因此要搞个镜像服务器,内容当然都是一样的咯. 第一步:进入系统设置 第 ...
- Jquery 设置class 和 div CSS
Jquery 设置class 和 div CSS 1 Jquery 根据标签内容获取标签div,从而修改该div CLASS //追加 $('label:contains("labelcon ...
- hiho1509 异或排序
题目链接 题目大意: 给定一个长度为 n 的非负整数序列 a[1..n] 你需要求有多少个非负整数 S 满足以下两个条件: (1).0 ≤ S < 260 (2).对于所有 1 ≤ i < ...
- PCL例程调试错误之缺少flann-config.cmake
编译环境和PCL版本为:win7-x64 + MSVC2013 + PCL1.8.0-win32-MSVC2013. 调试PCL官网例程Cluster Recognition and 6DOF Pos ...
- RelativeLayout.addRule()方法
RelativeLayout.addRule()方法 通过LayoutParams的 addRule方法来额外的添加别的规则了,android.widget.RelativeLayout.Layout ...
- Matplotlib 画廊
https://matplotlib.org/gallery.html
- PostGIS解析Geometry几何对象
一.Geometry转WKT select st_astext(geom) where tableName; 二.PostGIS常用函数 wkt转geometry st_geomfromtext(wk ...