zoukankan      html  css  js  c++  java
  • [SCOI 2008] 着色方案

    [题目链接]

              https://www.lydsy.com/JudgeOnline/problem.php?id=1079

    [算法]

            f[c1][c2][c3][c4][c5][pre]表示有c1种颜色可以涂1个木块,c2中颜色可以涂2个木块,.....,上一次的颜色可以涂pre个木块

            记忆化搜索即可

    [代码]

              

    #include<bits/stdc++.h>
    using namespace std;
    const int P = 1e9 + 7;
    
    int i,k,x;
    int cnt[10];
    int f[16][16][16][16][16][6];
    
    inline int dp(int c1,int c2,int c3,int c4,int c5,int pre)
    {
        if (c1 < 0 || c2 < 0 || c3 < 0 || c4 < 0 || c5 < 0) return 0;
        if (!c1 && !c2 && !c3 && !c4 && !c5) return f[c1][c2][c3][c4][c5][pre] = 1;
        if (f[c1][c2][c3][c4][c5][pre] != -1) return f[c1][c2][c3][c4][c5][pre];
        f[c1][c2][c3][c4][c5][pre] = 0;
        if (pre == 2) f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * (c1 - 1) * dp(c1 - 1,c2,c3,c4,c5,1)) % P;
        else  f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * c1 * dp(c1 - 1,c2,c3,c4,c5,1)) % P;
        if (pre == 3) f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * (c2 - 1) * dp(c1 + 1,c2 - 1,c3,c4,c5,2)) % P;
        else f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * c2 * dp(c1 + 1,c2 - 1,c3,c4,c5,2)) % P;
        if (pre == 4) f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * (c3 - 1) * dp(c1,c2 + 1,c3 - 1,c4,c5,3)) % P;
        else f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * c3 * dp(c1,c2 + 1,c3 - 1,c4,c5,3)) % P;
        if (pre == 5) f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * (c4 - 1) * dp(c1,c2,c3 + 1,c4 - 1,c5,4)) % P;
        else f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * c4 * dp(c1,c2,c3 + 1,c4 - 1,c5,4)) % P;
        f[c1][c2][c3][c4][c5][pre] = (f[c1][c2][c3][c4][c5][pre] + 1ll * c5 * dp(c1,c2,c3,c4 + 1,c5 - 1,5)) % P;
        return f[c1][c2][c3][c4][c5][pre];
    }
    
    int main()
    {
        
        scanf("%d",&k);
        for (i = 1; i <= k; i++)
        {
            scanf("%d",&x);
            cnt[x]++;
        }
        memset(f,255,sizeof(f));
        printf("%d
    ",dp(cnt[1],cnt[2],cnt[3],cnt[4],cnt[5],0));
        
        return 0;
    }
  • 相关阅读:
    Portable Executable 可移植可执行
    汇编跳转指令
    Java中this和super
    Java成员变量和类变量
    EasyUI select
    JAVA虚函数
    感想
    函数
    ueditor
    gitlab简介配置和参数修改
  • 原文地址:https://www.cnblogs.com/evenbao/p/9340865.html
Copyright © 2011-2022 走看看