博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AC日记——[SCOI2008] 着色方案 bzoj 1079
阅读量:7157 次
发布时间:2019-06-29

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

 

思路:

  dp;

  我们如果dp方程为15维,每维记录颜色还有多少种;

  不仅tle,mle,它还re;

  所以,我们压缩一下dp方程;

  方程有6维,第i维记录有多少种颜色还剩下i次;

  最后还要记录上次使用是第几维;

 

来,上代码:

#include 
#include
#include
#include
using namespace std;#define ll long long#define mod 1000000007ll n,m[6],sum,ai[6],dp[16][16][16][16][16][6];bool if_[16][16][16][16][16][6];ll dfs(ll a,ll b,ll c,ll d,ll e,ll f){ if(a<0||b<0||c<0||d<0||e<0) return 0; if(a+b+c+d+e>sum) return 0; if(a>m[5]||b>m[4]||c>m[3]||d>m[2]||e>m[1]) return 0; if(if_[a][b][c][d][e][f]) return dp[a][b][c][d][e][f]; if_[a][b][c][d][e][f]=true; ll now=0; if(f==1) { now+=dfs(a,b,c,d,e+1,0)*(e+1); now+=dfs(a,b,c,d,e+1,1)*(e+1); now+=dfs(a,b,c,d,e+1,2)*e; now+=dfs(a,b,c,d,e+1,3)*(e+1); now+=dfs(a,b,c,d,e+1,4)*(e+1); now+=dfs(a,b,c,d,e+1,5)*(e+1); } else if(f==2) { now+=dfs(a,b,c,d+1,e-1,0)*(d+1); now+=dfs(a,b,c,d+1,e-1,1)*(d+1); now+=dfs(a,b,c,d+1,e-1,2)*(d+1); now+=dfs(a,b,c,d+1,e-1,3)*d; now+=dfs(a,b,c,d+1,e-1,4)*(d+1); now+=dfs(a,b,c,d+1,e-1,5)*(d+1); } else if(f==3) { now+=dfs(a,b,c+1,d-1,e,0)*(c+1); now+=dfs(a,b,c+1,d-1,e,1)*(c+1); now+=dfs(a,b,c+1,d-1,e,2)*(c+1); now+=dfs(a,b,c+1,d-1,e,3)*(c+1); now+=dfs(a,b,c+1,d-1,e,4)*c; now+=dfs(a,b,c+1,d-1,e,5)*(c+1); } else if(f==4) { now+=dfs(a,b+1,c-1,d,e,0)*(b+1); now+=dfs(a,b+1,c-1,d,e,1)*(b+1); now+=dfs(a,b+1,c-1,d,e,2)*(b+1); now+=dfs(a,b+1,c-1,d,e,3)*(b+1); now+=dfs(a,b+1,c-1,d,e,4)*(b+1); now+=dfs(a,b+1,c-1,d,e,5)*b; } else if(f==5) { now+=dfs(a+1,b-1,c,d,e,0)*(a+1); now+=dfs(a+1,b-1,c,d,e,1)*(a+1); now+=dfs(a+1,b-1,c,d,e,2)*(a+1); now+=dfs(a+1,b-1,c,d,e,3)*(a+1); now+=dfs(a+1,b-1,c,d,e,4)*(a+1); now+=dfs(a+1,b-1,c,d,e,5)*(a+1); } now%=mod; dp[a][b][c][d][e][f]=now;// printf("%d %d %d %d %d %d %lld\n",a,b,c,d,e,f,now); return now;}int main(){// freopen("color.in","r",stdin);// freopen("color.out","w",stdout); cin>>n;ll pos; for(ll i=1;i<=n;i++) { cin>>pos; ai[pos]++; } for(ll i=1;i<=5;i++) { for(ll j=i;j<=5;j++) m[i]+=ai[j]; sum+=ai[i]; } dp[ai[5]][ai[4]][ai[3]][ai[2]][ai[1]][0]=1; if_[ai[5]][ai[4]][ai[3]][ai[2]][ai[1]][0]=true; cout<

 

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6835177.html

你可能感兴趣的文章
【转】Android开源项目发现---ListView篇(持续更新)
查看>>
利用锚点制作简单索引效果
查看>>
影响网站打开速度的9大因素
查看>>
HTML5之废弃和更新的元素与属性
查看>>
[转]asp.net解决高并发的方案.
查看>>
(转)unity中基于alpha通道的shadow volume实现
查看>>
linux下svn的co如何排除目录
查看>>
项目中最常用到的颜色
查看>>
[转]10个学习Android开发的网站推荐
查看>>
【linux驱动分析】之dm9000驱动分析(六):dm9000_init和dm9000_probe的实现
查看>>
交大人在各行各业一直不懈追逐着自己的创业梦想,如携程网、
查看>>
SGU 538. Emoticons 水题
查看>>
.net mvc4 利用 kindeditor 上传本地图片
查看>>
Note:This element neither has attached source nor attached Javadoc
查看>>
android 逆向project smail 语法学习
查看>>
CI框架 -- 开发环境、生产环境
查看>>
命令行解析器
查看>>
用ajaxFileUpLoad上传文件不能正确取得返回值的问题
查看>>
Aqua Data Studio 查询结果中文乱码
查看>>
js推断指定函数、变量是否存在的方法
查看>>