状压 DP 选讲

讲题

Posted by WrongAnswer_90's Blog on January 6, 2025

DFSCount

$f_{S,i}$ 表示从点 $i$ 开始遍历完集合 $S$ 的方案数。转移是看删掉 $i$ 之后会分裂成 $k$ 个连通块就乘一个 $k!$,然后每个连通块选一个点开始遍历。$\mathcal O(2^nn^2)$。

DAG 计数

给无向图,定向使得不存在环,求方案数。

$f_S$ 表示集合 $S$ 的答案。转移是枚举入度为 $0$ 的点剥掉。

但是会算重,所以一次需要剥掉一个独立集 $T$,系数是 $(-1)^{ T +1}$,正确性归纳证明。

色多项式

$f(G,x)$ 表示用 $x$ 种颜色对图进行染色的方案数。

无环定向等价于 $(-1)^nP(-1)$(?)

设 $a(G)$ 表示对无向图 $G$ 进行无环定向方案数。$a(G)=a(G-(u,v))+a(G\vert (u,v))$。考虑 $(u,v)$ 这条边,先确定除了他以外的所有边。如果 $(u,v)$ 之间没有可达关系那他贡献是 $2$,否则是 $1$。设没有可达关系为 $X$,有可达关系是 $Y$。

第一种表示去掉 $(u,v)$ 这条边,的意义是 $(u,v)$ 之间有无可达关系都可以。这样是 $X+Y$。第二种表示把 $(u,v)$ 合并起来。这样是 $X$。加起来就是 $2X+Y$,正好是要统计的。

而设 $f(G,k)$ 表示 $G$ 的 $k$ 染色方案数,有 $f(G,k)=f(G-(u,v),k)-f(G (u,v),k)$,就是一个很简单的容斥。然后怎么着归纳一下是不是就好了(反正我不会)。

用这个结论可以把这个这个题做的更优秀。记录当前轮廓线上等价关系即可,复杂度是 $\mathcal O(B(\min(n,m))poly(n,m))$。

[ABC306Ex] Balance Scale

现在有相等的情况。还是设 $f_S$ 表示 $S$ 内部方案。不同的是枚举入度为 $0$ 的连通块 $T$ 的时候,$T$ 不是独立集了,是若干个并起来的块,需要处理辅助转移的一点东西。

QOJ7 主旋律

典。

$f_S$ 表示 $S$ 内部强联通方案数。

枚举入度为 $0$ 的强联通分量集合。也是需要什么辅助转移。

[AGC017F] Zigzag

要做 $m$ 次前缀和。每次做前缀和的位置从前向后做,假设做到了位置 $i$,$1$ 表示向右拐,$0$ 表示向左拐。如果这个位置 $S$ 是 $0$ 则可以把 $i$ 后面的第一个 $1$ 移到 $i$ 的位置,如果没有 $1$ 就新建一个 $1$。

image.png

P10221 [省选联考 2024] 重塑时光

不怎么好的回忆。

看成是 DAG 上划分若干个连通块,贡献是连通块内部拓扑序乘积。

如果每次暴力拼一个连通块的话,会算重,一种划分方案会被计算“外层拓扑序数量”次。

所以要容斥,还是枚举若干个集合拼起来的集合,一个数组辅助转移即可。

要记录这个集合里有几个连通块,所以两个集合并起来的时候第二维是一个卷积,拉插可以除一个 $n$。

[AGC024F] Simple Subsequence Problem

需要从 $S$ 不重不漏的生成其所有子序列。$f_{S,i}$ 表示已经确定了一个 $S[1,i]$,后面未确定的部分是 $S[i+1, S ]$。转移类似子序列自动机。

QOJ2068 Fast as Ryser

很奇妙的 trick。

考虑把 $2i,2i-1$ 之间连虚边,这样匹配会形成若干个环和链。

对于一个链,$f_{S,x}$ 表示当前匹配的对集合是 $S$,当前点 $x$ 没有匹配。枚举一个 $t\notin S$,匹配 $(x,t)$,转移到 $f_{S 2^{t/2},t^1}$。

对于一个环,钦定他的起点是最大的点,然后转移只能向小的转移,最后再和一开始的连在一起即可。

最后需要做一个子集 exp。

CF468E Permanent

不同连通块之间独立。对于每个块其大小 $\leq k+1$。所以一定有一边大小 $\leq (k+1)/2$。对这半边状压。这样是 $\mathcal O(2^\frac{k}{2}k^2)$。

比较离谱啊!假设对左边状压,那一个左边的点如果扫右边的时候后面没有和他的连边的边了,那他就不需要状压了。

所以每次选左边度数最小的点,把它相邻的点放到右边序列的前面,这样会有右边的一个顺序,按照这个顺序 DP 就跑的很快。

数仙人掌

很深刻!先求 $f_S$ 表示 $S$ 形成了一个环的方案数。然后枚举 $i$,把 $i$ 周围所有连通块做一个 exp,这样 $f_{2^n-1}$ 就是答案。

###