「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)\) 要在离散化数组里面,或者全部改成左闭右开也可以)


CF1523E Crypto Lights


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\) 的个数,这个题这样做也要方便些,这就是 正难则反


posted @ 2022-08-12 21:58  Saintex  阅读(32)  评论(0编辑  收藏  举报