[SCOI2008]着色方案

本文分享了一道涉及数位DP的题目解析及C++代码实现。作者通过多次尝试最终解决问题,并强调关注数据范围ci<=5的特点。文章提供的代码详细展示了如何使用递归和记忆化搜索来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题。。。我截图截了两遍。。。为啥嘞?第一遍没截数据范围。。。

仔细思考过这个题的人都应该知道了。。。这个题要从数据 ci<=5 做文章

思路不是很好解释。。。

emm。。。看代码参悟一下应该就可以了。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define mo 1000000007
using namespace std;
ll n,t[6],f[16][16][16][16][16][6],x;
bool l[16][16][16][16][16][6];

ll dp(int a,int b,int c,int d,int e,int k)
{
    ll ans=0;
    if(l[a][b][c][d][e][k]) return f[a][b][c][d][e][k];
    if(a+b+c+d+e==0) return 1;
    if(a!=0) ans+=(a-(k==2))*dp(a-1,b,c,d,e,1);
    if(b!=0) ans+=(b-(k==3))*dp(a+1,b-1,c,d,e,2);
    if(c!=0) ans+=(c-(k==4))*dp(a,b+1,c-1,d,e,3);
    if(d!=0) ans+=(d-(k==5))*dp(a,b,c+1,d-1,e,4);
    if(e!=0) ans+=(e)*dp(a,b,c,d+1,e-1,5);
    f[a][b][c][d][e][k]=ans%mo;
    l[a][b][c][d][e][k]=1;
    return f[a][b][c][d][e][k];
}

int main()
{
    scanf("%d",&n);
    memset(f,-1,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        t[x]++;
    }
    cout<<dp(t[1],t[2],t[3],t[4],t[5],0)%mo;
}
呆码

 

转载于:https://www.cnblogs.com/zzzyc/p/9004269.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值