bzoj 1079: [SCOI2008]着色方案【记忆化搜索】

本来打算把每个颜色剩下的压起来存map来记忆化,写一半发现自己zz了
考虑当前都能涂x次的油漆本质是一样的。
直接存五个变量分别是剩下12345个格子的油漆数,然后直接开数组把这个和步数存起来,记忆化dfs即可

#include<iostream>
#include<cstdio>
using namespace std;
const int N=17,mod=1e9+7;
int n,a[7];
long long f[N][N][N][N][N][7];
bool v[N][N][N][N][N][7];
long long dfs(int a,int b,int c,int d,int e,int w)
{
    if(v[a][b][c][d][e][w])
		return f[a][b][c][d][e][w];
    if(a+b+c+d+e==0)
		return 1;
    long long t=0;
    if(a)  
        t+=(a-(w==2))*dfs(a-1,b,c,d,e,1);  
    if(b)  
        t+=(b-(w==3))*dfs(a+1,b-1,c,d,e,2);  
    if(c)  
        t+=(c-(w==4))*dfs(a,b+1,c-1,d,e,3);  
    if(d)  
        t+=(d-(w==5))*dfs(a,b,c+1,d-1,e,4);  
    if(e)  
        t+=e*dfs(a,b,c,d+1,e-1,5);  
    v[a][b][c][d][e][w]=1;
    return f[a][b][c][d][e][w]=(t%mod);
}
int main()
{
    scanf("%d",&n);
    for(int i=1,x;i<=n;i++)
    {
		scanf("%d",&x);
		a[x]++;
	}
    printf("%lld\n",dfs(a[1],a[2],a[3],a[4],a[5],0));
    return 0;
}
posted @ 2018-09-07 17:43  lokiii  阅读(143)  评论(0编辑  收藏  举报