BZOJ 1079 着色方案

Posted on 2016-10-31 12:04  ziliuziliu  阅读(...)  评论(... 编辑 收藏

本来只会压位。。。看了黄学长的题解恍然大悟。。。同样数量的颜色本质上是相同的啊。。。

然后就从5^15变成15^5就可以做了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mod 1000000007
using namespace std;
long long k,cnt[6],c[20],dp[6][16][16][16][16][16];
long long dfs(long long x,long long a,long long b,long long c,long long d,long long e)
{
    if (dp[x][a][b][c][d][e]) return dp[x][a][b][c][d][e];
    long long ret=0;
    if (a) ret=(ret+(a-(x==2))*dfs(1,a-1,b,c,d,e)%mod)%mod;
    if (b) ret=(ret+(b-(x==3))*dfs(2,a+1,b-1,c,d,e)%mod)%mod;
    if (c) ret=(ret+(c-(x==4))*dfs(3,a,b+1,c-1,d,e)%mod)%mod;
    if (d) ret=(ret+(d-(x==5))*dfs(4,a,b,c+1,d-1,e)%mod)%mod;
    if (e) ret=(ret+e*dfs(5,a,b,c,d+1,e-1)%mod)%mod;
    dp[x][a][b][c][d][e]=ret;
    return ret;
}
int main()
{
    scanf("%lld",&k);
    for (long long i=1;i<=k;i++)
    {
        scanf("%lld",&c[i]);
        cnt[c[i]]++;
    }
    for (int i=1;i<=5;i++) dp[i][0][0][0][0][0]=1;
    printf("%lld\n",dfs(0,cnt[1],cnt[2],cnt[3],cnt[4],cnt[5]));
    return 0;
}