「2022-8-10/11 做题记录」组合数 / DP
组合数还要再练练
很多时候并不是一个组合数,而是用 dp 套 组合数
CF367E Sereja and Intervals
考虑每个位置被哪些区间覆盖到。设其为 \([l,r]\)。
有个性质:既然一个区间不会覆盖另一个区间,所以不可能两个区间共用左端点 / 右端点。
发现从一个位置移到下一个位置,\(l\) 最多会加 \(1\),\(r\) 最多会加 \(1\)。
那么我们就有一个 \(\mathcal {O}(n^2m)\) 的显然 dp。
但是我还以为这个会 T 卡了 1h ...
其实 \(nm\leqslant 10^5,n\leqslant m\),所以 \(n^2m \leqslant 10^5\sqrt {10^5}\)。
emm... 可以滚动数组。做完了。
但是好像可以抽象成笛卡尔坐标系考虑。转为组合数。胡了一下,时间复杂度是 \(\mathcal {O}(n^2)\)。
CF140E New Year Garland
发现考虑下一层的时候,这一层具体的颜色不用管,有影响是颜色的种类个数。
CF1237F Balanced Domino Placements
md 骨牌有顺序,什么垃圾题面。
也就是说,我们要统计用了多少骨牌。最后乘阶乘。
暴力 \(dp_{n,m,k}\) 表示现在剩下 \(n\) 行,\(m\) 列,选了 \(k\) 个骨牌的方案数。
但是大可不必考虑横着的骨牌,因为选完竖着的过后它就可以直接计算。其实是,横着和竖着可以独立计算。
所以现在为 \(dp1_{i,j}\) 为选到第 \(i\) 行,选了 \(j\) 个竖着的骨牌的方案数。
则 \(dp1_{i,j}=dp1_{i-1,j}+dp1_{i-2,j-1}\)。
注意这里不能乘具体地放哪个位置的系数。
\(dp2\) 同理。
最后组合。
CF1536F Omkar and Akmar
难点在第一步啊。
考虑 最终状态,不可能存在连续两个空格,去掉空格必须是 ABABAB...。
所以最后的步数一定是偶数。后手必赢。
所以随便选了。emm..... 其实可以爆搜找规律 / 猜结论。
然后组合数算即可。枚举空格。
刚开始推出来 \(\mathrm {ans}=\sum_{i=0}^{\lfloor \frac n 2 \rfloor} \binom {n} {2 i}\times (2i)!\)。
发现这个式子好像也能适配链的情况。。那就错了。。。
CF1188C Array Beauty
暴力 dp:\(dp_{i,j,k}\) 为最后一项为 \(i\),长度为 \(j\),现在的 \(\min\) 为 \(k\) 的方案数。
\(dp_{i,j,\min(k,|b_i-b_j|)}=\sum dp_{las,j-1,k}\)。
。。。
发现:\(k<\frac {100000}{j}\),所以 dp 空间开不下,但是时间可以跑。。。具体地,你会说,当前状态与现有的决策点取 \(\min\) 不应该有很多值吗?怎么 \(\mathcal {O}(1)\) 转。其实,我们不是枚举上一个状态,而是枚举当前状态,这样的话,\(\min\) 就不会变,用前缀和优化即可。
那么既然 \(dp\) 数组里面维度多,我们就枚举维度,具体地,枚举最后的 \(\min\)?
做完了。\(\mathcal {O}(10^5n)\)。
CF1295F Good Contest
能不能离散化后只关注端点?
可以。暴力转 dp 即可。注意遍历到的所有点都必须在离散化数组里面(也就是说,\(R_i+1(-1)\) 要在离散化数组里面,或者全部改成左闭右开也可以)
CF814E An unavoidable detour for home
一道很 NB 的 DP 题,需要深刻的对 DP 及其技巧的理解
编号可以根据图动态钦定?
首先有个结论:跑 bfs 树,剩下的边是同层的相连。这与原题是充要关系。
推出一个三维 dp,不知道行不行。(
就是一层一层选,令 \(dp_{i,c_1,c_2}\) 为选了 \(i\) 个,最后一层有 \(c_1\) 个剩下度数为 \(1\),\(c_2\) 个度数为 \(2\) 的方案数。然后一层一层枚举,好像要设置辅助 dp。\(\mathcal {O}(n^4)\) 是能转的。
具体看看刚才那个 dp,发现只要我们最后一层的节点定了,\(c_1,c_2\) 都定了。(因为每个点只会和层数 - 1的某一个点连边)
所以令 \(dp_{i,j}\) 为选了 \(i\) 个,最后一层有 \(j\) 个节点的方案数。
我们 钦定算到下一层的时候才去处理上一层连上一层、这一层连上一层的情况。
设 \(g_{i,j,k}\) 为当前层 \(i\) 个节点,上一层有 \(j\) 个剩下度数为 \(1\) 的节点,\(k\) 个剩下度数为 \(2\) 的节点的方案数。
-
若 \(i=0,j=0,k=0\),方案数为 \(1\)。
-
若 \(i=0,j=0,k\neq 0\),发现是由多个简单环组成(\(size_环 \geqslant 3)\)。
\(g_{0,0,k}=\sum_{i=3}^k\binom {k-1} {i-1} (i!)/i/2*g_{0,0,k-i}\)。
(P.S. 并不是 \(g_{0,0,k}=\sum_{i=3}^k\binom k i (i!)/i/2*g_{0,0,k-i}\)。因为这样会因为选的顺序不同而出现多种重复方案。我们钦定强制选包括最后一个点的环) -
若 \(i=0,j\neq 0,k\neq 0\),枚举度数为 \(1\) 的点与谁连,\(g_{0,j,k}=g_{0,j-2,k}*(j-1)+g_{0,j-1,k-1}*k\)。
-
若 \(i\neq 0,j\neq 0,k\neq 0\),枚举这一层的点与谁连,\(g_{i,j,k}=g_{i-1,j-1,k}*j+g_{i-1,j,k-1}*k\)。
\(dp_{i,j}=\sum_{k=1}^{i-j}dp_{i-j,k}*g_{j,c_1,c_2}\)。\(c_1,c_2\) 为 \([i-j-k+1,i-j]\) 中度数为 \(2,3\) 的点个数。
答案即为 \(\sum_{i=1}^n dp_{n,i}*g_{0,c_1,c_2}\)。
发现计算 \(g\) 的复杂度不是 \(n^4\) 而是 \(n^3\),计算 \(dp\) 的复杂度是 \(n^3\),所以时间复杂度为 \(\mathcal {O}(n^3)\)。
CF1111D Destroy the Colony
能否和字符集有关?
诈骗点 1:询问次数其实不是 \(10^5\),是 \(52 * 52\)。
考虑暴力:背包 dp,\(n * 52 * 52 * 52\)。
然而我们发现这里面有很多重复计算的东西。
能不能搞个前缀和背包,本质上是高维前缀和。
背包进行的顺序并不影响值。
\(10^5*52*52\) 能不能过啊?答案是可以的。
好像有个名字叫退背包。
Character Encoding
简单容斥排列组合。
Separated Number
如果我强制令某一个数是第几位,方案数可以用组合数算。
对于某个 \(10^i\),用前缀和算出上面可以有多少 \(1\sim 9\),然后进行 “盒子与球” 算出方案数。
注意这里有类似 \(\binom {x} {0}+\binom {x} {1}+...+\binom {x} {k}\) 的东西。
因为 "\(k\)" 固定,想到与 \(\binom {x-1} {0}+\binom {x-1} {1}+...+\binom {x-1} {k}\) 联系。算二次即可。递推。
即 \(f_i=f_{i-1}*2-\binom {i-1}{k}\)。时间复杂度:\(\mathcal {O}(Tn)\)。
Tom and matrix
lucas+组合数。
Xiao Ming's Hope
用 lucas 证明得 \(ans=2^{1的个数}\)。
Interesting Yang Yui Triangle
lucas 板题。但是降智了想了好久。。。原因是把题读反了。
但是,如果题目真的变成了求余数为 \(0\) 的个数,这个题这样做也要方便些,这就是 正难则反。