zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    NetCore实现404和500状态码自定义处理页面
    分享一款好玩的工具
    React三大属性
    谷歌浏览器安装react-developer-tools报错
    初次使用create-react-app
    聊聊webservice
    对java一点感悟
    设计模式之二策略模式(java实现)
    设计模式之一单例模式(java实现)
    java回调函数
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9737312.html
Copyright © 2011-2022 走看看