LUOGU P2476 [SCOI2008]着色方案

Posted sdfzsyq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LUOGU P2476 [SCOI2008]着色方案相关的知识,希望对你有一定的参考价值。

传送门

 

解题思路

毒瘤题,,刚开始写了个奇奇怪怪的哈希,结果T了5个点。。后来深(kan)入(le)思(ti)考(jie),发现c的范围很小,设$f[a][b][c][d][e][pre]?$表示还能涂一个格子的有a个,两个格子的有b个。。。pre表示上一个涂的颜色,转移看代码,比较好想。

 

技术分享图片
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int MAXN = 17;
const int mod = 1e9+7;
typedef long long LL;

int k,c[MAXN],cnt[MAXN];
int f[MAXN][MAXN][MAXN][MAXN][MAXN][7];

int dfs(int a,int b,int c,int d,int e,int pre){
    if(f[a][b][c][d][e][pre]) return f[a][b][c][d][e][pre];
    if(!a && !b && !c && !d && !e) return f[a][b][c][d][e][pre]=1;
    int ret=0;
    if(a) ret=(ret+(LL)(a-(pre==2))*dfs(a-1,b,c,d,e,1)%mod)%mod;
    if(b) ret=(ret+(LL)(b-(pre==3))*dfs(a+1,b-1,c,d,e,2)%mod)%mod;
    if(c) ret=(ret+(LL)(c-(pre==4))*dfs(a,b+1,c-1,d,e,3)%mod)%mod;
    if(d) ret=(ret+(LL)(d-(pre==5))*dfs(a,b,c+1,d-1,e,4)%mod)%mod;
    if(e) ret=(ret+(LL)e*dfs(a,b,c,d+1,e-1,5)%mod)%mod;
    return f[a][b][c][d][e][pre]=ret;
}

int main(){
    scanf("%d",&k);
    for(int i=1;i<=k;i++) scanf("%d",&c[i]),cnt[c[i]]++;
    printf("%d",dfs(cnt[1],cnt[2],cnt[3],cnt[4],cnt[5],0));
    return 0;
}
View Code

 

以上是关于LUOGU P2476 [SCOI2008]着色方案的主要内容,如果未能解决你的问题,请参考以下文章

P2476 [SCOI2008]着色方案(记搜&多维dp)

[BZOJ1079][SCOI2008]着色方案

BZOJ 1079: [SCOI2008]着色方案

bzoj 1079: [SCOI2008]着色方案

bzoj1079: [SCOI2008]着色方案(dp)

[BZOJ1079][SCOI2008]着色方案 dp