Loading

关于斜率优化的一些理解

引入: 题目类型

对于这样的一类柿子

\[dp_i = \min_{j < i} (dp_j - a_i d_j) , a_{i + 1} \geq a_i, d_{j + 1} \geq d_j \]

朴素的单调队列显然无法优化, 考虑通过 斜率优化 将其转化成只与 \(j\) 有关的形式方便优化

操作: 具体原理

首先是一个转化
拆掉 \(\min\)

\[dp_i = dp_j - a_i d_j \]

得到

\[dp_j = dp_i + a_i d_j \]

\(y = dp_j\) , \(k = a_i\) , \(x = d_j\) , \(b = dp_i\) , 柿子变成一次函数的形式

\[y = kx + b \]

这里的转化需要满足如下性质
\(k\) 只与 \(i\) 有关, 单调递增
\(b\) 只与 \(i\) 有关, 且只有其包含 \(dp_i\)
\(x\) 只与 \(j\) 有关, 单调递增
\(y\) 只与 \(j\) 有关, 且只有其包含 \(dp_j\)

\(dp_i\) 看做未确定的变量, 问题转化为用一条斜率为 \(k\) 的直线去切一些决策点 \((x, y)\) , 求直线截距的最小值
容易发现维护下凸包之后, 找到斜率 \(< k , > k\) 的转折点即可

然后根据 \(k, x\) 的单调性, 你发现这个做法可以拓展到整个序列上, 复杂度 \(\mathcal{O} (n)\) , 结束

posted @ 2025-01-08 10:43  Yorg  阅读(12)  评论(0)    收藏  举报