bzoj 1079 题解
来源:互联网 发布:广东动易软件 编辑:程序博客网 时间:2024/06/07 06:18
迭代加深搜索,加点dp的味道
状态定义有点神奇 dp[a][b][c][d][e][l]表示还剩a个1,b个2,c个3,d个4,e个5,最后一个属于什么分类来分
那么的话就从b变成a就是(b-1),(a+1) 然后用组合数学相乘即可。
今天感谢ouyangwenbin
Code:
/************************************************************** Problem: 1079 User: wohenshuai Language: C++ Result: Accepted Time:120 ms Memory:56568 kb****************************************************************/ #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define LL unsigned long long#define Mod 1000000007using namespace std;int n;int a[16];LL f[16][16][16][16][16][6];int Count[6];bool bo[16][16][16][16][16][6];void Input(){ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); Count[a[i]]++; }}LL dfs(int a,int b,int c,int d,int e,int l){ if(a+b+c+d+e==0) return 1; if(bo[a][b][c][d][e][l]) return f[a][b][c][d][e][l]; LL tmps=0; if(a) tmps+=dfs(a-1,b,c,d,e,1)*(a-(l==2)); if(b) tmps+=dfs(a+1,b-1,c,d,e,2)*(b-(l==3)); if(c) tmps+=dfs(a,b+1,c-1,d,e,3)*(c-(l==4)); if(d) tmps+=dfs(a,b,c+1,d-1,e,4)*(d-(l==5)); if(e) tmps+=dfs(a,b,c,d+1,e-1,5)*e; tmps%=Mod; f[a][b][c][d][e][l]=tmps; bo[a][b][c][d][e][l]=1; return f[a][b][c][d][e][l];}void Solve(){ memset(bo,0,sizeof(bo)); printf("%lld\n",dfs(Count[1],Count[2],Count[3],Count[4],Count[5],0)%Mod);}int main(){ Input(); Solve(); return 0;}
0 0
- bzoj 1079 题解
- bzoj题解
- bzoj 1218题解
- bzoj 2456 mode 题解
- bzoj 2506 calc 题解
- BZOJ 1257 (题解)
- bzoj 1003 题解
- bzoj 1053 题解
- bzoj 2761 题解
- bzoj 2464 题解
- bzoj 1085 题解
- bzoj 2464 题解
- bzoj 1045 题解
- bzoj 1059 题解
- bzoj 1054 题解
- bzoj 1050 题解
- bzoj 1047 题解
- bzoj 1083 题解
- java操作excel
- 寒假自主学习项目一 - 链表(2、查找)
- C++读写txt文件
- eclipse 最佳配置
- 多线程之Executor框架
- bzoj 1079 题解
- watchify和browserify
- Android开发中在一个Activity中关闭另一个Activity
- python xlrd 使用
- Web App的零框架解决方案
- 好记性不如烂笔头26-JAVA处理文件事务(4)
- const的用法,特别是用在函数前面与后面的区别!
- webstorm、phpstorm、idea等使用技巧记录
- IOS学习 App Store审核指南中文版