计数DP

矩阵加速计数

对于一类线性递推计数问题,可能遇到 \(n\) 很大的情况,这个时候 \(O(n)\) 的 DP 都是不可通过的。这个时候就需要考虑写出转移矩阵,用矩阵乘法加速计数。这是一类重点问题,且可以出得有一定难度。

例题

P3702 [SDOI2017] 序列计数
考虑用总方案数减去一个质数都不选的方案,两个方案数都很好用矩阵转移。代码

众数计数

关于一个区间的绝对众数的相关计数问题,朴素的状态设计为 \(f_{i,j,k}\) ,表示要选为众数的数选了 \(j\) 个,非众数的数选了 \(k\) 个的方案数。但是考虑对绝对众数的要求是出现次数 > \(\lfloor \frac{n}{2} \rfloor\) ,因此我们只关心 \(j-k\) 的值,于是可以用 \(f_{i,j}\) 表示原状态中 \(j-k\) 的值,从而把 DP 从 \(O(n^3)\) 优化到了 \(O(n^2)\)

例题

P5664 [CSP-S 2019] Emiya 家今天的饭
这一道题就是上述优化的一个模板应用。代码

杂题

P3214 [HNOI2011] 卡农
好题。首先无序序列可以转化为有序序列,最后除以 \(m!\) 即可。考虑题目对于所选音乐的限制:在 \(m\) 个片段中,

  • 任意片段不能选空集
  • 任意两个片段选出的集合不能完全相同
  • 任意一个元素出现的次数为偶数次

直接求满足条件的方案数显然不可行,考虑容斥。设 \(f_i\) 表示选到第 \(i\) 个片段,且当前片段序列满足上述三个条件的方案数。如果 \(1\)\(i-1\) 都已经确定,那么第 \(i\) 个片段唯一确定。所以总方案数显然是

posted @ 2025-11-05 22:36  lyc1119  阅读(5)  评论(0)    收藏  举报