我不会数数。
计数 DP 是一类 DP,强调不重不漏的一类 DP。
在设计状态上稍微有点毒瘤,且一般与组合数学有关。
Codeforces Round #313 Gerald and Giant Chess
- http://codeforces.com/problemset/problem/559/C
先假设黑点的横纵坐标都是递增的,状态设计:fi 表示不经过任何在他前面的黑点到达该点的方案数,显然有:fi=Cxi+yi−2xi−1−∑j=1i−1fj×Cxi+yi−xj−yjxi−xj(xi≥xj,yi≥yj)。
直接转移即可,时间复杂度 O(n2)。
CEOI 2002 A Decorative Fence
- http://poj.org/problem?id=1037
显然有一个试填法:设当前一位填 x,统计符合条件的状态个数 T,若 T≥S,说明当前一位就是 x,继续枚举下一位,否则 S=S−T,x=x+1 继续枚举。
考虑预处理出 T 值来加速,设 fi,j,k 表示共有 i 块木板,最左边的木板高度为 j,位置情况是 k,有:
fi,j,0=p=j∑i−1fi−1,p,1fi,j,1=p=1∑j−1fi−1,p,0
暴力转移后试填即可,时间复杂度 O(n3)。
POJ 1737 Connected Graph
- http://poj.org/problem?id=1737
设 fi 为含 i 个点的有标号连通图个数,考虑 DP。
发现如果正着做比较难做,但显然,有 i 个点的有标号无向图个数为 22i×(i−1) 个,考虑拿所有的减去不符合的,枚举 1 号点连通块所含的节点个数 j。
有:
fi=22i×(i−1)−j=1∑i−1fj×Ci−1j−1×22(i−j)×(i−j−1)
直接递推即可,时间复杂度 O(n2),本题需要配合高精度,建议配合 Poly 后写 [集训队作业2013]城市规划。
How Many of Them?
- https://www.luogu.com.cn/problem/P6596
本题较为复杂,供学有余力的读者思考。——《算法竞赛进阶指南》李煜东
设 fi,j 为 i 个点,含 j 条割边的无向连通图数量,gi,j,k 为 i 个点,j 个双连通分量,k 条割边的无向连通图数量。
先处理 j>0 的情况:
- 枚举 1 号点所在双连通分量大小 k,显然所在的双连通分量组成方案为 fk,0×Ci−1k−1。
- 剩下的怎么求呢?联合 gi,j,k 来求,又可以枚举一个 x 表示删掉 1 号点所在双连通分量后的连通块个数,那就又有 gi−k,x,j−x×kx 种方案。
那么就有:
fi,j(j>0)=k=1∑i−1(fk,0×Ci−1k−1×x=1∑min(i−k,j)gi−k,j,j−x×xk
设 hi 为含 i 个点的连通图个数,容易发现 fi,0=hi=∑j=1i−1fi,j。
剩下的问题就是求 gi,j,k:
- 枚举含 1 号点的双连通分量,其大小为 p,含割边为 q,那么该双连通分量的组成方案也就有 fp,q×Ci−1p−1 个。
- 其他部分的选法也就有 gi−p,j−1,k−q 个。
- 而要连接起来可以随便选一个点,所以又有 p 个。
那么也就有:
gi,j,k=p=1∑iq=0∑kfp,q×Ci−1p−1×p×gi−p,j−1,k−q
综上所述,有:
hi=22i×(i−1)−j=1∑i−1hj×Ci−1j−1×22(i−j)×(i−j−1)fi,j(j>0)=k=1∑i−1(fk,0×Ci−1k−1×x=1∑min(i−k,j)gi−k,j,j−x×xkfi,0=hi=j=1∑i−1fi,jgi,j,k=p=1∑iq=0∑kfp,q×Ci−1p−1×p×gi−p,j−1,k−q
时间复杂度 O(n5)。