AT_dp_z Frog 3 题解

Posted on 2024-03-02 17:07  _XOFqwq  阅读(10)  评论(0编辑  收藏  举报

这题的朴素 dp 是显然的。

\(dp_i\) 表示跳到第 \(i\) 个石头的最小花费,有转移方程:

\[dp_i=\min_{j=1}^{i-1}\{dp_j+(h_i-h_j)^2+C\} \]

直接转移是 \(O(n^2)\) 的,考虑优化。

首先对于 \(\min\) 以内的式子化简,得:

\[dp_j+h_i^2+h_j^2-2h_ih_j+C \]

将与 \(j\) 无关的项剔除,得:

\[dp_j+h_j^2-2h_ih_j \]

\(f_i\) 表示 \(dp_i+h_i^2\)\(k\) 表示 \(-2h_i\),得:

\[f_j+kh_j \]

此时,我们考虑有两个转移点 \(j_1,j_2\)

\(j_1<j_2\)\(j_2\) 一定不比 \(j_1\) 更优,仅当:

\[f_{j_1}+kh_{j_1} \le f_{j_2}+kh_{j_2} \]

移项,得:

\[kh_{j_1}-kh_{j_2} \le f_{j_2}-f_{j_1} \]

两边同时除以 \(h_{j_1}-h_{j_2}\)(不等式要变号,因为 \(h_{j_1}-h_{j_2}<0\))得:

\[k \ge \dfrac{f_{j_2}-f_{j_1}}{h_{j_1}-h_{j_2}} \]

代入 \(k=-2h_i\),得:

\[-2h_i \ge \dfrac{f_{j_2}-f_{j_1}}{h_{j_1}-h_{j_2}} \]

两边同时乘以 \(-1\),得:

\[2h_i \ge \dfrac{f_{j_1}-f_{j_2}}{h_{j_1}-h_{j_2}} \]

然后我们发现这个式子与斜率的计算公式十分相似,于是考虑斜率优化。

具体地,我们分析三个候补转移节点 \(p_1,p_2,p_3\),它们满足 \(p_1<p_2<p_3\)

\(\operatorname{slope}(i,j)\) 表示 \(\dfrac{f_i-f_j}{h_i-h_j}\)

\(p_2\) 是最优转移节点,则有:

\[2h_i \ge \operatorname{slope}(p_1,p_2) \]

表示 \(p_1\) 一定不比 \(p_2\) 更优,并且有:

\[2h_i \le \operatorname{slope}(p_2,p_3) \]

表示 \(p_3\) 一定不比 \(p_2\) 更优,也即,当:

\[\operatorname{slope}(p_1,p_2) \le \operatorname{slope}(p_2,p_3) \]

时,有 \(p_2\)\(p_1,p_2,p_3\) 中的最优转移节点。

这样每次选取最优转移节点,它们便组成了一个凸包。

由于题目保证 \(h_i\) 单调递增,

于是我们采用单调队列维护此凸包,

每次转移时从队头寻找最优转移节点,

转移完成后再从队尾弹出不是最优转移节点的节点即可。

这样转移的单次均摊时间复杂度降至 \(O(1)\),总时间复杂度为 \(O(n)\)

实现是简单的。