• [洛谷P5259] 游戏中的学问


    求环的一道dp题

    求环DP的解法

    对于本题来说,对于每一个形成的新环,都有两种状态中的一种状态转移而来

    设定f[i][j]代表i个人形成j个环的方案数

    状态一:由f[i-1][j]转移过来,对于每一个位置都有插空的可能性,所以需要×(n-1)

    状态二:由f[i-3][j-1]转移过来,我们可以得到在两个环组成一个新的环的时候,可以由i-3个人围成j-1个环,然后再选出两个人去拉手组成一个大环

    因为由i-1个的小环插入的时候需要×(i-1),然后对于i-3个人的时候插入就需要在这个基础上在×(i-2)  //这是显然的,因为这个组合是随机的,顺序均为单向

    Code:

    #include<iostream>
    #include<cstdio>
    #define MAXN 2003
    #define ll long long
    using namespace std;
    ll n,k,p;
    ll dp[MAXN << 1][MAXN];
    int main()
    {
        scanf("%lld%lld%lld",&n,&k,&p);
        dp[0][0] = 1;
        for(ll i=1;i<=n;i++)
        for(ll j=1;j<=min(i / 3,k);j++)
        dp[i][j] = (dp[i - 1][j] * (i - 1) % p + dp[i - 3][j - 1] * (i - 1) * (i - 2) % p) % p;
        printf("%lld",dp[n][k]);
        return 0;
    }
  • 相关阅读:
    NOIP普及组2003经验总结
    Day6上午 DP练习题
    Day4 图论
    Day3 数据结构
    使用ettercap进行dns欺骗和获取目标浏览的图片
    flask入门
    攻防世界-web-unserialize3
    数据结构课设作业-----飞机订票系统
    bugku NaNNaNNaNNaN-Batman
    it's a test
  • 原文地址:https://www.cnblogs.com/lyp-Bird/p/10913504.html
Copyright © 2020-2023  润新知