「日常训练」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 ...
随机推荐
- c++ 单引号和双引号
c++中单引号表示一个字符,双引号表示字符串 python中单引号与双引号是一样的
- ASP.NET整体运行机制+asp.net请求管道+页面生命周期+MVC整体运行机制原理图
在网上找的,个人感觉很好的
- 【luogu P1307 数字反转】 题解
题目链接:https://www.luogu.org/problemnew/show/P1307 刚入门的一道字符串模拟,分四种情况讨论来做比较好. #include<iostream> ...
- FreeImage.lib库的配置和简单使用 转
转载地址 http://www.codeweblog.com/win8-1%E4%B8%8Bfreeimage-lib%E5%BA%93%E7%9A%84%E9%85%8D%E7%BD%AE%E5%9 ...
- android SQLITE的基本使用总结(八)
sharedPreferences只适合存储比较简单的数据和键值对,支持不同的数据类型 文件存储连键值对都没有,不会进行任何格式化处理,存储简单的二进制或者文本数据 sqlite则能处理一些数据量大, ...
- SpringBoot非官方教程 | 第九篇: springboot整合Redis
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot9-redis/ 本文出自方志朋的博客 这篇文章主 ...
- 菜鸟笔记 -- Chapter 6 面向对象
在Java语言中经常被提到的两个词汇是类与对象,实质上可以将类看作是对象的载体,它定义了对象所具有的功能.学习Java语言必须要掌握类与对象,这样可以从深层次去理解Java这种面向对象语言的开发理念, ...
- ZooKeeper下载安装(Windows版本)
进入Apache ZooKeeper官方网站进行下载,https://zookeeper.apache.org/releases.html 这里我们选择zookeeper-3.4.12版本进行下载 百 ...
- ACL常用命令及工作原理
What ACL 是一系列 IOS 命令,根据数据包报头中找到的信息来控制路由器应该转发还是应该丢弃数据包.ACL 是思科 IOS 软件中最常用的功能之一. 在配置后,ACL 将执行以下任务: 限制网 ...
- js解决异步的方法汇总
参考:https://www.cnblogs.com/zuobaiquan01/p/8477322.html 一.callback回调函数 回调是一个函数被作为一个参数传递到另一个函数里,在那个函数执 ...