「日常训练」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]\times 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;
}
「日常训练」The Intriguing Obsession(CodeForces Round #439 Div.2 C)的更多相关文章
- 「日常训练」Watering Flowers(Codeforces Round #340 Div.2 C)
题意与分析 (CodeForces 617C) 题意是这样的:一个花圃中有若干花和两个喷泉,你可以调节水的压力使得两个喷泉各自分别以\(r_1\)和\(r_2\)为最远距离向外喷水.你需要调整\(r_ ...
- 「日常训练」Alternative Thinking(Codeforces Round #334 Div.2 C)
题意与分析 (CodeForces - 603A) 这题真的做的我头疼的不得了,各种构造样例去分析性质... 题意是这样的:给出01字符串.可以在这个字符串中选择一个起点和一个终点使得这个连续区间内所 ...
- 「日常训练」More Cowbell(Codeforces Round #334 Div.2 B)
题意与分析(CodeForces 604B) 题意是这样的:\(n\)个数字,\(k\)个盒子,把\(n\)个数放入\(k\)个盒子中,每个盒子最多只能放两个数字,问盒子容量的最小值是多少(水题) 不 ...
- 「日常训练」Ice Cave(Codeforces Round 301 Div.2 C)
题意与分析(CodeForces 540C) 这题坑惨了我....我和一道经典的bfs题混淆了,这题比那题简单. 那题大概是这样的,一个冰塔,第一次踩某块会碎,第二次踩碎的会掉落.然后求可行解. 但是 ...
- 「日常训练」School Marks(Codeforces Round 301 Div.2 B)
题意与分析(CodeForces 540B) 题意大概是这样的,有一个考试鬼才能够随心所欲的控制自己的考试分数,但是有两个限制,第一总分不能超过一个数,不然就会被班里学生群嘲:第二分数的中位数(科目数 ...
- 「日常训练」Regular Bridge(Codeforces Round 306 Div.2 D)
题意与分析 图论基础+思维题. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back #defi ...
- 「日常训练」Two Substrings(Codeforces Round 306 Div.2 A)
题意与分析 一道非常坑的水题.分析醒了补. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back ...
- 「专题训练」Hard problem(Codeforces Round #367 Div. 2 C)
题意与分析 题意:给出\(n\)个字符串,可以反转任意串,反转每个串都有其对应的花费\(c_i\).经过操作后是否能满足字符串\(\forall i \in [1,n] \text{且} i \in ...
- Codeforces Round #439 (Div. 2)【A、B、C、E】
Codeforces Round #439 (Div. 2) codeforces 869 A. The Artful Expedient 看不透( #include<cstdio> in ...
随机推荐
- 关于TOCTTOU攻击的简介
前言 最近看到了一些以 at 结尾的Linux系统调用,在维基百科上面说这可以防御一些特定的TOCTTOU攻击,而在TOCTTOU对应页面中并没有中文版的介绍,而且百度的结果也比较少,于是决定抽空写一 ...
- VS中添加预处理宏的方法
VS中添加预处理宏的方法 除了在.c及.h中添加宏定义之外,还可以采用如下方法添加宏定义: 1.若只需要定义一个宏(如#define DEBUG),可以右键点击工程-->属性-->c/c+ ...
- Java中基本类型和引用类型(简单介绍)
8种基本类型 一.4种整型 byte 1字节 -128——127 short 2 字节 -32,768 —— 32,767 in ...
- 几个常用的 Git 高级命令
Git 是一款开源优秀的版本管理工具,它最初由 Linus Torvalds 等人开发,用于管理 Linux Kernel 的版本研发.相关的书籍和教程网上琳琅满目,它们多数都详细的介绍其基本的使用和 ...
- udt通信java再次升级1.1版
以前完成了udt的java代码测试,功能基本完成,近几天有时间重新梳理了下源码: 对原通信的关闭统一了方法,close定位过时,由shutdown与shutdownNow代替. 将一些主要方法添加了注 ...
- django-auth认证模块
########django-auth认证模块######## auth模块:它是django自带的用户认证模块,帮我们解决了登陆,注册,注销,修改密码 等等一系列的操作,封装成一个个方法,方便我们使 ...
- Easyui多个下拉框联动效果
好久没写前端了,以前在做多级联动的时候,用的是easyui的tree结构,但是需要一次性全部加载,不是按需加载,性能不好,退而求其之,用多个下拉框做 eayui的combobox 有onSelect ...
- 小胖办证 wzoi
小胖办证 题目描述: xuzhenyi要办个签证.办证处是一座M层的大楼,1<=M<=100. 每层楼都有N个办公室,编号为1..N(1<=N<=500).每个办公室有一个签证 ...
- chromium之ThreadLocalStorage
看看头文件怎么用 // Wrapper for thread local storage. This class doesn't do much except provide // an API fo ...
- python 如何在列表list,字典dict,集合set 中根据条件筛选数据
from random import randint """ list 过滤掉负数 """ data = [randint(-10, 10) ...