用两道例题简单讲讲斜率优化。
好久都没写博客了,反正就我一个人看也没关系。
单调队列
在这之前去学了下单调队列优化,大概就是DP的时候要从前面某个地方转移过来,DP方程里除了新增的量和前面没什么关系的时候就可以用单调队列。
其中$g(i)$函数和$j$没关系。其实本来维护一波$f$前缀里的最优解就可以的,如果有一些下标上的限制(诸如相差不超过$k$),就要用单调队列了。
不难证明时间复杂度从$O(N^2)$优化到了$O(N)$。随便放个屁
斜率优化
上面问题的升级版。
也就是说$g$和$i、j$都有关系。
直接用两个水题说
HDU3507
题目大意
已知数组$C$,要求将其分成若干段,每一段的代价是$\sum{C_i}+M$,其中$M$是常数。
Solution
先写下暴力
记$s$是$c$的前缀和。
假设决策点$k$比$j$更优。
不妨设$k \lt j$那么应该满足条件:
简单变换一下,得到
令$y[i] = f[i-1] +s[i-1]^2$,$x[i] = s[i-1]$,合并、换元可得
由于$s$递增,移项可得
不难发现式子左边就是斜率的形式。
视情况(即最大化还是最小化)维护上凸壳或者下凸壳。正确性的证明,运用反证法拉出最后的三个点,讨论最后两个点之间的斜率和$2 \times s[i]$之间的大小关系即可。
还两道题懒得写详细过程了,反正都是一样的。
[HNOI2008]玩具装箱TOY
|
|
[APIO2010]特别行动队
|
|
据说只刷模板题会变蠢?