标签:
Time Limit: 20 Sec
Memory Limit: 256 MB
http://www.lydsy.com/JudgeOnline/problem.php?id=1079
Input
第一行为一个正整数k,第二行包含k个整数c1, c2, ... , ck。
Output
输出一个整数,即方案总数模1,000,000,007的结果。
Sample Input
3
1 2 3
Sample Output
10
题意
题解:
直接dp[a][b][c][d][e][f]表示上一个状态为f时,我可以涂1次的有a个,涂两次的有b个,涂三次的有c个,涂四次的有d个,涂五次的有e个的方案数
直接记忆化搜索转移就好了
代码
#include<iostream> #include<stdio.h> using namespace std; int tmp[10]; int dp[16][16][16][16][16][7]; int vis[16][16][16][16][16][7]; #define mod 1000000007 long long dfs(int a,int b,int c,int d,int e,int n){ if(vis[a][b][c][d][e][n]) return dp[a][b][c][d][e][n]; if(a+b+c+d+e==0) return dp[a][b][c][d][e][n]=1; long long ans=0; if(a)ans+=(a-(n==2))*dfs(a-1,b,c,d,e,1); if(b)ans+=(b-(n==3))*dfs(a+1,b-1,c,d,e,2); if(c)ans+=(c-(n==4))*dfs(a,b+1,c-1,d,e,3); if(d)ans+=(d-(n==5))*dfs(a,b,c+1,d-1,e,4); if(e)ans+=(e-(n==6))*dfs(a,b,c,d+1,e-1,5); vis[a][b][c][d][e][n]=1; ans%=mod; return dp[a][b][c][d][e][n]=ans; } int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { int x;scanf("%d",&x); tmp[x]++; } printf("%d\n",dfs(tmp[1],tmp[2],tmp[3],tmp[4],tmp[5],0)); }
BZOJ 1079: [SCOI2008]着色方案 记忆化搜索
标签:
原文地址:http://www.cnblogs.com/qscqesze/p/4941061.html