codeforces 2100左右的dp题 泛刷
我也不知道有没有 2100,反正就拿来做了。顺便记录一下心得。
我也不知道是不是都是 DP,反正就拿来做了。现在发现有一些算不上 DP,不纯正属于是。
因为我才刷了一点点并且重心还在这上面,所以会持续更新。
CF16E Fish
- 状压 DP & 概率
枚举未知量,然后枚举谁吃了谁来转移。(假设 \(i\) 吃了 \(j\))
\[f_S = \sum_{j \not\in S \& i \in S} f_{S \mid j} \times a_{i,j} \times \frac{1}{cnt \times (cnt + 1)}
\]
\(cnt\) 表示的是 \(S\) 中 \(1\) 的数量。
CF14D Two Paths
- 树的直径
题目要求树上两路径乘积的 \(\max\)。
本身好像并不可做。但是 \(n\) 很小,可以暴力断边,然后对两棵树分别求树的直径找最大乘积。
好像有换根 DP 的线性做法,感觉很牛逼,但是我不会。
CF930C Teodor is not a liar!
- 最长上升子序列
显然你需要知道一个点被多少线段覆盖。这个可以差分维护。
然后你开始手模样例,你想知道什么情况下可以知道所有点都不能被所有线段覆盖。
然后你发现,如果一段选取的序列中存在两个峰,那它是不合法的。
所以你猜所有合法的序列一定是一个单峰的,然后从前往后从后往前搞一个最长上升子序列就做完了。
我不会最长上升子序列 \(O(n \log n)\) 做法,所以我用了线段树。
CF936B Sleepy Game
- tarjan, dfs
具体情况看我写的题解吧,我累了。