Loading

组合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. 容斥处理1

    $g$即为恰好0个和睦的答案。

考虑那个经典套路:

我们先随便放,有 $(2n)!$ 种方案。

恰好k个的答案可以表示出,我们暴力减去它们,这样即可 $O(n^2)$ 递推,可过原版(P4921)。

  1. 组合意义递推

(可以,这很错排)

首先选出两个非情侣,为去重放在第一排,有 $2n\times(2n-2)$ 种选法。

然后若其配偶坐在一起,转化为子问题 $g_{n-2}$ ,则方案数为 $2\times (n-1)\times g_{n-2}$ 。

否则,其配偶必须不坐在一起,等价于情侣,转化为子问题 $g_{n-1}$,则方案数为 $g_{n-1}$。

这样就可以递推了。

  1. 二项式反演(容斥处理2)

见容斥专题,略。

P3214

首先形式化题面:

在集合$S=\{1,2,...,n\}$中选出$m$个子集,满足三点性质:

(1)$m$个子集互不相同。

(2)$m$个子集都不为空。

(3)$m$个子集中,$1$到$n$每个元素出现的次数必须是偶数。

我们根据数据范围容易想到线性递推。

那么只有两种情况:

  1. 枚举元素,$O(n)$ $\text{dp}$

然而这样似乎不行(

  1. 枚举子集,$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状态细化。(因为容斥本是一种思想,只是前一个容斥相对更加暴力)

组合意义:

posted @ 2023-07-24 20:21  hsaht2426  阅读(31)  评论(0)    收藏  举报  来源