【BZOJ1079】【codevs2428】着色方案,DP
来源:互联网 发布:python爬虫下音乐 编辑:程序博客网 时间:2024/06/15 03:39
传送门1
传送门2
思路:
首先暴力可以得50分……
然后发现这个题是DP
关于DP状态,比较容易想到记录每种颜色的剩余个数和上一个位置的颜色,从而转移
但我们发现颜色数<=15,有点大了
但是每种颜色的个数很少,只有5
那我们可以考虑记录剩余个数为5,4,3,2,1的颜色数和上一个位置的颜色
也就是说f[a][b][c][d][e][i]表示能用1,2,3,4,5次的颜色分别为a,b,c,d,e,上一个位置的颜色能用i次,
这样的话转移就比较显然了
由于状态有增有减,推荐记忆化搜索完成DP
复杂度
代码:
#include<cstdio>#include<cstring> #include<iostream>#define mo 1000000007#define LL long longusing namespace std;int n,k,data[16],f[16][16][16][16][16][5],sum[6];int dp(int a,int b,int c,int d,int e,int i){ if (!a&&!b&&!c&&!d&&!e&&!i) return 1; if (f[a][b][c][d][e][i]!=-1) return f[a][b][c][d][e][i]; int t=0; if (a) t=(t+(LL)dp(a-1,b,c,d,e,0)*(a-(i==1))%mo)%mo; if (b) t=(t+(LL)dp(a+1,b-1,c,d,e,1)*(b-(i==2))%mo)%mo; if (c) t=(t+(LL)dp(a,b+1,c-1,d,e,2)*(c-(i==3))%mo)%mo; if (d) t=(t+(LL)dp(a,b,c+1,d-1,e,3)*(d-(i==4))%mo)%mo; if (e) t=(t+(LL)dp(a,b,c,d+1,e-1,4)*(e-(i==5))%mo)%mo; return f[a][b][c][d][e][i]=t;}main(){ scanf("%d",&k); for (int i=1;i<=k;++i) scanf("%d",data+i), n+=data[i], ++sum[data[i]]; memset(f,-1,sizeof(f)); printf("%d",dp(sum[1],sum[2],sum[3],sum[4],sum[5],0));}
0 0
- 【BZOJ1079】【codevs2428】着色方案,DP
- bzoj1079: [SCOI2008]着色方案 dp
- [BZOJ1079]SCOI2008着色方案|DP
- [BZOJ1079][SCOI2008][DP]着色方案
- [DP] BZOJ1079: [SCOI2008]着色方案
- [bzoj1079][SCOI2008]着色方案
- BZOJ1079: [SCOI2008]着色方案
- bzoj1079 [SCOI2008]着色方案
- bzoj1079 [SCOI2008]着色方案
- bzoj1079: [SCOI2008]着色方案
- bzoj1079[SCOI2008]着色方案
- BZOJ1079[SCOI2008]着色方案
- 【bzoj1079】[SCOI2008]着色方案
- BZOJ1079: [SCOI2008]着色方案
- bzoj1079 [SCOI2008]着色方案
- 【BZOJ1079】[SCOI2008]着色方案【计数DP】【奇怪的姿势】
- BZOJ1079 [SCOI2008]着色方案 记忆化搜索DP 妙啊
- BZOJ1079 着色方案(高维DP+神奇的状态)
- boost库 win7 vs2013安装
- Palindrome
- Grunt介绍与应用
- php中cookies禁用如何获取session
- 球形检测
- 【BZOJ1079】【codevs2428】着色方案,DP
- error: Apostrophe not preceded by \ (in CREATE TABLE tb_cammonitor_configs
- Android个人学习小结2016.9
- 2012蓝桥杯预赛试题本科c++比酒量
- 如何修改Ruby的gem源(gem sources)
- 编写DLL所学所思(2)——导出类
- POJ-2993-Emag eht htiw Em Pleh
- 用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题),假定在16位机器上
- nyoj737石子合并