Codeforces DP 题杂练
CF1271D Portals
\(\text{Problem}\):题目链接
\(\text{Solution}\):
首先有个显然的 \(dp\),记占领第 \(i\) 个点后有 \(j\) 个兵的最大答案。然后直接暴力转移是 \(O((n+m)(k+\sum\limits b_{i}))\) 的,考虑优化将兵派到其他点驻守的转移过程。
发现对于一个点 \(x\) 来说,如果存在点 \(v\) 到 \(u\) 的边\((v>u)\),则可以只在 \(max\{v\}\) 的位置考虑转移到 \(x\)。很显然,如果想派一个兵驻守点 \(x\),可以在最后能到达 \(x\) 的点再过去。在此之前,这个兵可以一直“凑数”用,也可以满足 \(a_{i}\) 的限制,必然没有比它更优的转移方式。故时间复杂度优化到 \(O(n(k+\sum\limits b_{i}))\),可以通过本题。
\(\text{Code}\):代码链接
CF1265E Beautiful Mirrors
\(\text{Problem}\):题目链接
\(\text{Solution}\):
经典期望 \(dp\),考虑正向推和反向推。
正向:
设 \(f_{i}\) 表示到第 \(i\) 天且第 \(i\) 天也开心的期望天数。显然答案就是 \(f_{n}\)。
对于第 \(i\) 天来说,有:
即可能到第 \(i\) 天时可以继续走,或者回到了 \(1\) 号节点,要再走期望 \(f_{i}\) 天才能开心。
化简上式,得 \(f_{i}=(f_{i-1}+1)\times \frac{100}{p_{i}}\),即可直接递推得到 \(f_{n}\)。
反向:
设 \(f_{i}\) 表示从第 \(i\) 天开始能开心到极点的期望天数,\(f_{1}\) 即为答案,而 \(f_{n+1}=0\)。此处先假设 \(p_{i}\) 变为 \(\frac{p_{i}}{100}\)。
对于第 \(i\) 天来说,有:
得到 \(f_{1}=f_{2}+\frac{1}{p_{1}}\),将 \(f_{2}\) 用 \(f_{1}\) 表示,得 \(f_{1}=f_{3}+\frac{1+p_{1}}{p_{1}p_{2}}\)。继续推下去,则有:
直接递推即可。
\(\text{Code}\):代码链接