博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1079: [SCOI2008]着色方案(DP)
阅读量:4631 次
发布时间:2019-06-09

本文共 1589 字,大约阅读时间需要 5 分钟。

1079: [SCOI2008]着色方案

题目: 

 

题解:

   DP刚神多年前讲过的一道神题。

   二话不说,上来就是一个六维数组:F[i][a][b][c][d][e]//表示上一次涂的颜色是还剩下i次可用的,a~e表示不同次数的颜色种数。

   次数一样的颜色其实是相同的

   那么我们记忆化搜索一下就OK(表示很久没打过了...)

代码(巨丑勿喷):

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 const int mod=1000000007; 8 typedef long long LL; 9 LL f[6][16][16][16][16][16];//f[i][a][b][c][d][e]表示上一次涂的颜色是还剩下i次可用的,a~e表示不同次数的颜色种数 10 int a[6];11 int k;12 LL DP(int last,int a1,int a2,int a3,int a4,int a5)13 {14 if(a1<0 || a2<0 || a3<0 || a4<0 || a5<0)return 0;15 if(a1==0 && a2==0 && a3==0 && a4==0 && a5==0)return 1;16 if(f[last][a1][a2][a3][a4][a5]!=0) return f[last][a1][a2][a3][a4][a5];17 18 LL sum=0;19 sum=( sum + ( ( a1 - ( ( last==2 ) ? 1 : 0 ) ) * DP ( 1,a1-1,a2,a3,a4,a5 ) ) ) % mod;20 sum=( sum + ( ( a2 - ( ( last==3 ) ? 1 : 0 ) ) * DP ( 2,a1+1,a2-1,a3,a4,a5) )) % mod;21 sum=( sum + ( ( a3 - ( ( last==4 ) ? 1 : 0 ) ) * DP ( 3,a1,a2+1,a3-1,a4,a5) )) % mod;22 sum=( sum + ( ( a4 - ( ( last==5 ) ? 1 : 0 ) ) * DP ( 4,a1,a2,a3+1,a4-1,a5) )) % mod;23 sum=( sum + a5*DP(5,a1,a2,a3,a4+1,a5-1))%mod;24 f[last][a1][a2][a3][a4][a5]=sum;25 return sum;26 }27 int main()28 {29 memset(f,0,sizeof(f));30 scanf("%d",&k);31 for(int i=1;i<=k;i++)32 {33 int x;34 scanf("%d",&x);35 a[x]++;36 }37 printf("%lld\n",DP(0,a[1],a[2],a[3],a[4],a[5]));38 return 0;39 }

转载于:https://www.cnblogs.com/CHerish_OI/p/8443733.html

你可能感兴趣的文章
spring中实现自己的初始化逻辑
查看>>
Accommodation development for Kaikoura
查看>>
Oracle11.2新特性之listagg函数 (行列转换)
查看>>
Flutter学习之动态ListView
查看>>
myeclipse中安装svn插件
查看>>
微信小程序----调用用户信息
查看>>
Ubuntu系统---安NVIDIA 驱动后 CUDA+cuDNN 安装
查看>>
Spring Boot配置全局异常捕获
查看>>
Java 的zip压缩和解压缩
查看>>
SPOJ375(树链剖分)
查看>>
C基础知识小总结(十)
查看>>
Ignatius and the Princess IV (水题)
查看>>
ConcurrentHashMap实现原理及源码分析
查看>>
oracle执行计划连接方式
查看>>
机器学习 决策树 ID3
查看>>
Cmake
查看>>
vue 之 nextTick 与$nextTick
查看>>
JS设计模式——3.封装与信息隐藏
查看>>
git-- 使用
查看>>
delphi对窗体的查询(delphi xe2)
查看>>