组合dp做题记录
前言
2023.7.24 开坑
2023.7.26
2023.7.23开始做的,做/整理了四天,比较成功的越级。
剩下的八月前填完。
修改至按难度排序。
正文
组合 $\text{dp}$ =组合意义 $\text{dp}$ +组合计数 $\text{dp}$ 。
组合意义 $\text{dp}$ 即含有某些具有组合意义的(系)数的 $\text{dp}$ 。
组合意义 $\text{dp}$ 可以转化为组合计数 $\text{dp}$ 。
评价:水很深,没有实力较好地总结,所以是做题记录。
CF559C
不经过某点集不是很好求,会重复(容易忽略的常识),考虑容斥。
思路$0$:
题目给的条件是不能经过的点(且这样的点很少),容易考虑容斥定理,但显然$O(2^n)$容斥定理做是不可取的。
思路$1$:
我们考虑重复的本质(原因):
如果一个点经过了某条路径多次,那么这条路径毫无疑问会被重复计数。
这样我们可以考虑从本质上去重,我们考虑让一个路径的贡献为其第一个经过的点的贡献。
这样问题就转化为求不经过黑点到某个黑点的方案数。
转移大概是个容斥的套路(吗?):
先不考虑前面的点,然后枚举每个可能经过的点,用组合数算进行容斥,即:
$f[i]=C_{x_i+y_i-2}^{x_i-1}-\sum_{j=1}^{i-1}f[j]* C_{x_i+y_i-x_j-y_j}^{x_i-x_j}$
最后答案也这么算就行了。
(你也可以考虑正难则反,容易用组合数求出经过某点的总路径数,问题转化为求经过至少一个黑点的总路径数,然后dp。事实上是等价的。)
AGC001 E
由于组合数的性质 ${a_i+b_i+a_j+b_j \choose a_i+a_j}={a_i+b_i+a_j+b_j \choose b_i+b_j}$ ,考虑算两遍的思想,原式化为:
$$\sum_{i=1}^{n}\sum_{j=1}^{n}{a_i+b_i+a_j+b_j \choose a_i+a_j}-\sum_{i=1}^{n}{a_i+a_i+a_j+a_j \choose a_i+a_j}$$
$\sum_{i=1}^{n}{a_i+a_i+a_j+a_j \choose a_i+a_j}$ 显然可以快速求出。
考虑第一个式子中组合数${a_i+b_i+a_j+b_j \choose a_i+a_j}$的组合意义,即从某个横竖坐标差为$a_i+a_j$与$b_i+b_j$的格子走到另一端的方案数。
显然直接计算是与原来无异的,我们考虑将其放到一个图上以快速计算。
考虑整体法,合在一起计算,由于值域可以接受不难考虑 $\text{dp}$ ,这样复杂度其实还是无异的,因为点数极多,数量级是 $O(n^2)$ 的。
考虑最简表示,用较少的点其间的路径表示出上式,这样就变成了一个构造题。
考虑极限,最简单的便是仅 $2n$ 个点所形成的二分图,对于单对 $a_i,b_i$ 所对应的式子,我们只需要将其坐标设在 $(-a_i,-b_i)$ 即可,我们发现这刚好成立。(完全昏的的一步)
于是我们在所有 $(-a_i,-b_i)$ 的位置的dp值加一,然后递推即可。
实现:
注意有 $(-a_i,-b_i)$ 的位置的dp值加一,可能有重复的点。
拓展:
如果这道题直接给的是 $a_i+b_i$ 与 $a_i$。
我们仍然考虑算两遍,然后换元构造对称性。
AGC013 D
操作之间不影响,无后效性,显然考虑dp。
我们分析一下题目的条件究竟是什么,形式化题面:
设红砖有 $a$ 个,蓝砖有 $b$ 个。
于是初始时有 $a+b=n$ 。
显然任何时候都有 $a\ge0,b\ge0$ ,我们将其作为操作的前置条件以方便dp向前转移。
每次操作分为如下四类:
操作序列为 $RR$ :条件(就是上面的普适结论的转化)为 $a\ge1$ ,会使 $a$ 减少一, $b$ 增加一。
操作序列为 $RB$ :条件为 $a\ge1$ ,$a,b$不变。
操作序列为 $BR$ :条件为 $b\ge1$ ,$a,b$不变。
操作序列为 $BB$ :条件为 $b\ge1$ ,会使$a$增加一,$b$ 减少一。
求有多少种合法操作序列。
有两个变量不好分析,考虑最简表示,不放尝试用一者表示另一者。
容易发现 $a+b=n$ 操作后恒成立,于是得到 $a=n-b$ 。
再转化一下条件,我们现在只关心 $a$ :
操作序列为 $RR$ :条件为 $a\ge1$ ,会使 $a$ 减少一。
操作序列为 $RB$ :条件为 $a\ge1$ ,$a$ 不变。
操作序列为 $BR$ :条件为 $a<n$ ,$a$ 不变。
操作序列为 $BB$ :条件为 $a<n$ ,会使 $a$ 增加一。
这个条件完全可以 $\text{dp}$ ,状态完全够表示出来。
具体地,设 $f_{i,j}$ 代表枚举到第 $i$ 个操作时, $a=j$ 的方案数,转移十分显然,见上。
接下来有个问题,如何进行初始化?
首先尝试考虑对每个 $f_{0,j}$ 都初始化为1。
考虑其正确性,具体地,是否与操作序列一一对应。
很不幸,对于同一个操作序列,存在多个合法的 $a$。
对于算重,有两种思考方式:
方法一:从本质上去重
我们考虑找到 $f$ 的一个子集使其与答案形成双射。
此题的条件很好画图(例子),考虑用折线图表示出来。
容易发现同一个操作序列多个合法的 $a$ 相当于对原图像的平移。
于是我们额外记录经过0的图像数量即可,这样对于每个合法操作序列有且仅有一个方案与之对应。
转移仍然很显然,注意转为折线图考虑后,$a=1$ 时的RB操作也会接触0。
方法二:容斥
还是注意到如上性质,于是直接考虑用全集减不经过0的情况,由于可以平移,我们发现这等价于不经过n的方案数,用之前的 $\text{dp}$ 对 $n$ 与 $n-1$ 做两次即可。
或者你可以不管算重:
方法三:换一种思路(本人原方法)
考虑直接对图像计数,容易想到枚举 $\text{min}$ ,计算满足条件的数的数量,容易发现我们很好算在 $\text{min}$ 与 $\max$ 中的,但不好算 $\text{min}$ 一定的。
此时容易想到容斥,记录前缀也很好搞,单次跑一边之前的 $\text{dp}$ 即可,初始化只用处理单值。
但是有一个问题,整体复杂度是 $O(n^2m)$ 的
可以使用反射容斥(待学习)单次快速计算解决这个问题,但也可以考虑整体法,将容斥时加的与减的分组考虑,这样就得到了方法二的结论。
AGC002 F
先将题目条件转化一下,对于序列的任何一个前缀,白球数量必须大于等于其他颜色数量。
(不可能有人在按题目的条件做吧(雾))
这种限制无法算两遍,只能表示出,于是我们考虑设 $f_{i,j}$ 代表放了 $i$ 个白球,$j$ 种不同颜色的方案数,此时白球的限制就解决了。
接下来考虑转移:
放白球时,按顺序找到当前第一个可放的位置,显然有 $f_{i,j}=f_{i,j}+f_{i-1,j}$。
放新的颜色时,显然可以在已放的到最后放的间放这些颜色。
容易想到直接组合数计算,即 $f_{i+1}=f_i \times (n-i) \times {(n-i) \times k \choose k}$。
考虑证双射,发现它又会算重。
同样,我们考虑从本质上去重:
算重的本质即对于不同的枚举颜色顺序会产生相同的结果。(?)
我们钦定顺序不就好了吗。
于是我们对每次放的第一个球定在当前第一个可放的位置,这样就保证了枚举颜色顺序与不同方案一一对应。
方程即为 $f_{i+1}=f_i * (n-i) * {(n-i) * k -1 \choose k-1}$。
这样既可递推求解。
P4921/P4931
考虑大力组合计数。
-
恰好k个可以直接计数,即:
$\binom{n}{k}\times A_n^k\times 2^k$
$\binom{n}{k}$ 是选择座位,无序。
$A_n^k$ 是选择情侣,按序入座,有序。
$2^k$ 是情侣可交换位置。
-
$n-k$ 个错开不好计数,由于数据范围,我们尝试递推:
设其为 $g(n-k)$。
考虑求 $g(x)$:
考虑两(三)种思路:
-
容斥处理1
$g$即为恰好0个和睦的答案。
考虑那个经典套路:
我们先随便放,有 $(2n)!$ 种方案。
恰好k个的答案可以表示出,我们暴力减去它们,这样即可 $O(n^2)$ 递推,可过原版(P4921)。
- 组合意义递推
(可以,这很错排)
首先选出两个非情侣,为去重放在第一排,有 $2n\times(2n-2)$ 种选法。
然后若其配偶坐在一起,转化为子问题 $g_{n-2}$ ,则方案数为 $2\times (n-1)\times g_{n-2}$ 。
否则,其配偶必须不坐在一起,等价于情侣,转化为子问题 $g_{n-1}$,则方案数为 $g_{n-1}$。
这样就可以递推了。
- 二项式反演(容斥处理2)
见容斥专题,略。
P3214
首先形式化题面:
在集合$S=\{1,2,...,n\}$中选出$m$个子集,满足三点性质:
(1)$m$个子集互不相同。
(2)$m$个子集都不为空。
(3)$m$个子集中,$1$到$n$每个元素出现的次数必须是偶数。
我们根据数据范围容易想到线性递推。
那么只有两种情况:
- 枚举元素,$O(n)$ $\text{dp}$
然而这样似乎不行(
- 枚举子集,$O(m)$ $\text{dp}$
还是不好整,考虑(某种意义上的分组:)一个性质一个性质地考虑,于是容斥一下。
先求出所有满足3的方案,考虑满足偶数的方案的构成,我们发现若固定前 $i-1$ 个,必然存在且仅存在一个数使这个集合满足3,为$A_{2^n-1}^{i-1}$。
去除不满足性质 $2$ 的,即第 $i$ 个为空集的,显然剩余 $i-1$ 个满足条件,减去 $f_{i-1}$ 即可。
去除不满足性质 $1$ (且满足性质 $2$ 的),设第 $i$ 个与第 $j$ 个重复,那么显然第 $i$ 个不为空集,即满足性质 $2$,无需再去重。
那么剩下的$i-2$个满足条件,即$f_{i-2}$。而$j$有$i-1$种取值,子集$i$的取法为$2^n-1-(i-2)$,于是方案数为 $f_{i-2}\times(i-1)\times(2^n-i+1)$。
综上,转移即为$f_i=A_{2^n-1}^{i-1}-f_{i-1}-f_{i-2}\times(i-1)\times(2^n-i+1)$。
初始化可设 $f_0=1,f_1=0$ ,此处不难分析。
ARC124 E
首先环考虑断还为链计算。
考虑这个乘法的东西的组合意义,即从每个选完后的这里面分别选出来1个数的方案数,尝试考虑dp。
设第 $i$ 个人送出 $x_i$,考虑将单次答案形式化地,表示出来即为:
$$f_n=\prod_{i=1}^n (a_i-x_i+x_{i-1})$$
首先我们考虑是否形成双射,易发现会重复(可列方程(雾)),此时 $-x_i+x_{i-1}$ 一定。
考虑容斥,至少一个 $x_i=0$ 的解显然存在,我们用 $x_i\in[0,a_i]$ 的情况和所有 $x_i\in[1,a_i]$ 的权值相减即可。
两者是等价问题,我们考虑一种即可(以 $x_i\in[0,a_i]$ 为例):
首先有
$$f_n=\prod_{i=1}^n (a_i-x_i+x_{i-1})$$
展开第 $n$ 项:
$$a_n\prod_{i=1}^{n-1} (a_i-x_i+x_{i-1})-x_n\prod_{i=1}^{n-1} (a_i-x_i+x_{i-1})+x_{n-1}\prod_{i=1}^{n-1} (a_i-x_i+x_{i-1})$$
$a_n-x_n$ 与后一部分无关,我们可以考虑通过 $x_n$ 取值转移。
单独将它拿出来审视,设:
$$g_n=x_n\prod_{i=1}^n (a_i-x_i+x_{i-1})$$
考虑它的转移,也拆开第 $n$ 项来分析:
$$x_na_n\prod_{i=1}^{n-1} (a_i-x_i+x_{i-1})-x_n^2\prod_{i=1}^{n-1} (a_i-x_i+x_{i-1})+x_nx_{n-1}\prod_{i=1}^{n-1} (a_i-x_i+x_{i-1})$$
$x_na_n-x_n^2$ 与后一部分无关,考虑通过 $x_n$ 取值转移,观察最后一项其实就是 $x_ng_{n-1}$,从之前转移即可。
综上,有:
$$f_n=S_1(a_n)f_{n-1}+(a_n+1)g_{n-1}$$
$$g_n=(a_nS_1(a_n)-S_2(a_n))f_{n-1}+S_1(a_n)g_{n-1}$$
(此转移对于1同样成立,因为是个环)
(借鉴了Rolling_star的题解)
最后我们考虑初始化。
我们无法对环转移,所以只能钦定1的选择方案。
当前者选择 $a_i-x_i$ 时,显然第一项只与 $a_i-x_i$ 有关,所以可以直接设 $f_0=1,g_0=0$。
其他同理。
于是这道题就结束了。
总结
组合计数:
很多时候对于求方案数的问题,我们都可以使用dp解决(因为很容易安排去除后效性)。
在设计dp方案时,先考虑哪些条件容易表示,就放在dp中,如AGC002F;哪些条件难以表示,便去重,如P3214卡农。(但是有例外:CF559C,并不需要先设计dp状态,而是用dp去重)
在设计dp方案后,仍要考虑是否形成双射,即是否重复,如AGC013D。
若重复,可以考虑容斥或从本质上去重(其实就是分组然后)。
后者的实际计算时也可以用前者的思维,或者也可以考虑对dp状态细化。(因为容斥本是一种思想,只是前一个容斥相对更加暴力)
组合意义:

浙公网安备 33010602011771号