zoukankan      html  css  js  c++  java
  • 「日常训练」The Intriguing Obsession(CodeForces Round #439 Div.2 C)

    2018年11月30日更新,补充了一些思考。

    题意(CodeForces 869C)

    三堆点,每堆一种颜色;连接的要求是同色不能相邻或距离必须至少3。问对整个图有几种连接方法,对一个数取模。

    解析

    要求很重要:同色不能相邻很容易理解,但是>=3比较难理解。比较常见的是R->G->B->R,这样能看出来一个重要的结论:对单个节点只能连接某个颜色至多一个点(不然一定有距离为2的点)
    这样一来我们思考一下状态会和哪些东西有关联:如果我放一个一个新颜色在里面,它会怎么同原图产生联系?一是和几种颜色相连接,二是同几个点相连接,三就是不连接。(这是显然的,只能往这三个方向考虑)考虑第一个问题,会得出由上面加粗的情况,只能得到这个点只能和单种其他颜色连接的结论(也就是说,同一时刻我们只需要考虑两种颜色)。考虑第二个问题,会得出当它同某个点连接的时候,这个点将必须独立出来,不然不合题意(可能有人会思考,如果颜色是C,这个点本身是B,而它只是B->A,为什么一定要独立呢?原因很简单,在这里我们不考虑第三种颜色的影响,因为他们没有影响;那么这个情况下它就只是一个单独的点,仍然是相当于被独立出来的)。而将前两个问题同第三个问题结合起来,就能发现我们的状态了:$dp[i][j]$为第一个颜色有i个、第二个颜色有j个的情况下的方法数。它会有两种决策:新点要么与另一个颜色点群不连接,那么相当于无事发生过;要么与其中的一个点连接。而在只有这两个颜色的情况下,这个点只能跟这个新点独立出来(前面的结论)。因此有转移方程:$$dp[i][j]=dp[i-1][j]+dp[i-1][j-1] imes j,dp[i][0]=dp[0][i]=1$$

    这是两色下的转移方程,而两两之间的颜色是互不影响的,根据乘法原理,将三对的方案数相乘即可得解。注意到题目的n不超过5000,可以直接$O(n^2)$算法走人。


    代码

    #include <bits/stdc++.h>
    #define PB push_back
    #define MP make_pair
    #define fi first
    #define se second
    #define ZERO(X) memset((X),0,sizeof(X))
    #define ALL(X) X.begin(),X.end()
    #define F0(X,Y) for(int (X)=0;(X)!=(Y);++(X))
    #define F1(X,Y) for(int (X)=1;(X)<=(Y);++(X))
    using namespace std;
    typedef pair<int,int> PI;
    typedef pair<pair<int,int>, int> PII;
    typedef pair<pair<pair<int,int>, int>, int> PIII; 
    typedef long long ll;
    typedef unsigned long long ull;
    
    ll dp[5005][5005];
    const ll mod=998244353;
    int main()
    {
        int a,b,c; cin>>a>>b>>c;
        int maxn=max(a,max(b,c));
        ZERO(dp);
        dp[1][0]=dp[0][1]=dp[0][0]=1;
        for(int i=1;i<=maxn;++i) dp[0][i]=dp[i][0]=1;
        for(int i=1;i<=maxn;++i)
            for(int j=1;j<=maxn;++j)
                dp[i][j]=((dp[i-1][j]%mod)+((dp[i-1][j-1]%mod)*j)%mod)%mod;
        cout<<(((dp[a][b]*dp[b][c])%mod)*dp[a][c])%mod<<endl;
        return 0;
    }
    如非注明,原创内容遵循GFDLv1.3发布;其中的代码遵循GPLv3发布。
  • 相关阅读:
    CTFHub-Web-Web前置技能-HTTP协议-响应包源代码详解
    BurpSuite环境安装及设置
    i2 Analyst’s Notebook 9学习笔记之入门、基本概念和数据接口
    Python 练习题:用索引取出LIST中的值
    python 练习题:小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点
    zabbix4.0 本地安装详解及步骤
    CentOS 7 安装 mysql 5.7.27 for zabbix
    win7系统 右击任务栏 资源管理器 弹出菜单“已固定”和“最近”项目不显示故障处理
    CentOS 7 新系统 手动配置网络 简要步骤
    CentOS7 firewalld防火墙 启动 关闭 禁用 添加删除规则等 常用命令
  • 原文地址:https://www.cnblogs.com/samhx/p/CFR439D2C.html
Copyright © 2011-2022 走看看