斜率优化
引言
当你看到这一篇博客时,相信你已经对基本的 d p dp dp模型有了了解,已经能独立推导出较为简单的 d p dp dp式子,但有时在进行 d p dp dp转移的过程,需要耗费较高的复杂度,朴素的 d p dp dp方程及转移只能得到部分分数,无法取得AC,此时就需要如斜率优化这样来减少时间复杂度的工具。当然,斜率优化也只是一种工具,必须在可以推出正确但效率较低的 d p dp dp式后才能发挥用处,故而 d p dp dp的基本功才是关键。
斜率优化的难度体现在:在 O I OI OI领域初步接触到与几何相关的应用,首次理解上稍困难,但在理解后,斜率优化的难度其实并不高,掌握套路就可以轻松运用。
基础斜率优化(双单调)
前文中提到,斜率优化是用来辅佐 d p dp dp的,但也并不能辅佐所有的 d p dp dp。能被斜率优化的 d p dp dp非常典型,以一道题目为例:打印文章
给出 N N N 个单词,每个单词有个非负权值 C i C_i Ci,现要将它们分成连续的若干段,每段的代价为此段单词的权值和的平方,还要加一个常数 M M M,即 ( ∑ C i ) 2 + M (\sum C_i)^2+M (∑Ci)2+M。现在想求出一种最优方案,使得总费用之和最小。
不难得出朴素 d p dp dp做法:
设 f i f_i fi为将前 i i i个单词划分的最小费用, s u m c i sumc_i sumci表示 C i C_i Ci的前缀和
f i = m i n j = 0 i − 1 ( f j + ( s u m c i − s u m c j ) 2 + M ) f_i=min_{j=0}^{i-1}(f_j+(sumc_i-sumc_j)^2+M) fi=minj=0i−1(fj+(sumci−sumcj)2+M)
(若无法理解朴素 d p dp dp,建议先不要学习斜率优化)
在朴素 d p dp dp的过程中,需要同时枚举 i , j i,j i,j,复杂度为 n 2 n^2 n2,显然无法通过此题。
若只枚举 i i i,我们只需要花较低的复杂度找到一个最优的 j j j,即可以使 ( f j + s u m c i 2 − 2 × s u m c i × s u m c j + s u m c j 2 + M ) (f_j+sumc_i^2-2\times sumc_i\times sumc_j+sumc_j^2+M) (fj+sumci2−2×sumci×sumcj+sumcj2+M)最小的 j j j,找到之后转移即可,斜率优化正是来帮助我们快速地寻找到 j j j
对于上式中的多项式,将其展开为多个单项式,即:
f i = m i n j = 0 i − 1 ( f j + s u m c i 2 − 2 × s u m c i × s u m c j + s u m c j 2 + M ) f_i=min_{j=0}^{i-1}(f_j+sumc_i^2-2\times sumc_i\times sumc_j+sumc_j^2+M) fi=minj=0i−1(fj+sumci2−2×sumci×sumcj+sumc