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