题解 CF321E 【Ciel and Gondolas】
皎月半洒花
2020-03-26 12:50:02
这里再讲一种比除了 $wqs$ 二分之外都要优的 $O(n^2)$ 做法(神奇的与 $k$ 无关)。
首先决策单调性不再证明了,直接考虑怎么实现。
考虑记录一下每个点的决策范围。发现设状态 $(n,k)$ 最优决策位置记作 $opt(n,k)$ 的话,一定有
$$
opt(n,k-1)\leq opt(n,k)\leq opt(n+1,k)
$$
那么可以这么写:
```cpp
for j : 1 to k
for i : n to 1
for p : opt(i, j - 1) to opt(i + 1, j)
if [f(p, j - 1) < f(i, j)] opt(i, j) = p, f(i, j) := f(p, j - 1) ;
```
这样做显然是对的。于是来考虑这么做的时间复杂度。
发现对于这个决策矩阵的每一条穿过 $opt(i,j)$ 和 $opt(i+1,j+1)$ 的斜线,每条斜线的代价是 $O(n)$ 的,原因是考虑斜线 $opt(i,j),opt(i+1,j+1)$ 这条斜线的决策来自于 $opt(i,j-1),opt(i+1,j)$ 这条斜线。那么也就是说,每个斜线的转移都是 $O(n)$ 的,共有 $O(n+k)$ 条斜线,所以复杂度 $O(n^2)$ 。
代码就不给了,这个伪代码写的还是很规整的吧?