码迷,mamicode.com
首页 > 其他好文 > 详细

[SCOI 2008] 着色方案

时间:2018-07-20 13:58:34      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:代码   namespace   ret   搜索   表示   mes   style   c++   记忆化   

[题目链接]

          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\n",dp(cnt[1],cnt[2],cnt[3],cnt[4],cnt[5],0));
    
    return 0;
}

 

[SCOI 2008] 着色方案

标签:代码   namespace   ret   搜索   表示   mes   style   c++   记忆化   

原文地址:https://www.cnblogs.com/evenbao/p/9340865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!