bzoj1079: [SCOI2008]着色方案 dp

四川很喜欢dp啊,又是个神奇的dp。由于ci很小 我们可以以ci为维数,记下每个数量的油漆。由于不能有相同的颜色相邻我们要几下上次取的油漆属于哪一类。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define mod 1000000007
typedef long long sint;
int k,save[100],use[10],n;
sint f[16][16][16][16][16][6];
sint dfs(int a1,int a2,int a3,int a4,int a5,int last)
{
    int sum=a1+a2+a3+a4+a5;
    if(sum==0) return 1;
    if(f[a1][a2][a3][a4][a5][last]) return f[a1][a2][a3][a4][a5][last];
    sint tmp=0;
    if(a1) tmp+=((a1-(last==2))*dfs(a1-1,a2,a3,a4,a5,1));
    if(a2) tmp+=((a2-(last==3))*dfs(a1+1,a2-1,a3,a4,a5,2));
    if(a3) tmp+=((a3-(last==4))*dfs(a1,a2+1,a3-1,a4,a5,3));
    if(a4) tmp+=((a4-(last==5))*dfs(a1,a2,a3+1,a4-1,a5,4));
    if(a5) tmp+=a5*dfs(a1,a2,a3,a4+1,a5-1,5);
    f[a1][a2][a3][a4][a5][last]=tmp%mod;
    return f[a1][a2][a3][a4][a5][last];
}
int main()
{

    scanf("%d",&k);
    for(int i=1;i<=k;i++)
    {
        scanf("%d",&save[i]);
        use[save[i]]++;
    }
    sint ans=0;
    ans=dfs(use[1],use[2],use[3],use[4],use[5],0);
    printf("%lld\n",ans);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值