bzoj 1079: [SCOI2008]着色方案
2016-03-02 22:25
281 查看
#include<cstdio> #include<iostream> #define M 1000000007 using namespace std; int f[16][16][16][16][16][6],ma[16][16][16][16][16][6],a[6],k; long long dp(int a1,int a2,int a3,int a4,int a5,int a6) { if(a1+a2+a3+a4+a5==0) return 1; if(ma[a1][a2][a3][a4][a5][a6]) return f[a1][a2][a3][a4][a5][a6]; long long s=0; if(a1) s+=(a1-(a6==2))*(dp(a1-1,a2,a3,a4,a5,1)); if(a2) s+=(a2-(a6==3))*(dp(a1+1,a2-1,a3,a4,a5,2)); if(a3) s+=(a3-(a6==4))*(dp(a1,a2+1,a3-1,a4,a5,3)); if(a4) s+=(a4-(a6==5))*(dp(a1,a2,a3+1,a4-1,a5,4)); if(a5) s+=a5*(dp(a1,a2,a3,a4+1,a5-1,5)); ma[a1][a2][a3][a4][a5][a6]=1; return f[a1][a2][a3][a4][a5][a6]=s%M; } int main() { scanf("%d",&k); for(int i=1;i<=k;i++) { int a1; scanf("%d",&a1); a[a1]++; } printf("%lld",dp(a[1],a[2],a[3],a[4],a[5],0)); return 0; }
dp 由于每种颜色个数很少且具有相同个数的颜色在一定意义上是一样的 所以我们可以用这个dp,开一个六维数组,前五维分别存还有1,2,3,4,5个的颜色的数量,第六维存是从哪
转移来的。觉得记忆化搜索比较好写。
相关文章推荐
- POJ 3176 Cow Bowling
- 三条足以让电脑死机的命令(.bat文件)
- ListView在Activity和Fragment中的显示和使用
- Hibernate的延迟加载 ,懒加载,lazy
- passwd修改用户密码
- 线程、主线程、进程、操作系统、计算机硬件一些概念笔记和疑问
- sessionStorage localStorage 和 cookie 之间的区别转
- Xcode7 下导入第三方库 图文介绍
- try块和异常处理,断言assert
- Android Camera数据流分析全程记录(非overlay方式)
- Educational Codeforces Round 9 B. Alice, Bob, Two Teams 前缀和
- [转] 机器视觉开源代码集合
- 学习c语言
- Thread的理解
- iOS键盘的弹出与关闭总结
- SVN代码冲突
- 1.(c语言)产生随机数(rand()和srand()的配合使用)
- 用POI获取excel表中的图片位置及数据
- 《春日记》开发记录【4】
- Eclipse控制台输出中文乱码问题的解决