几个月前刚开始被拉去和高二一起学这个东西,感觉好高大上啊。。。

然后前几天碰到一道,觉得似乎可以理解一些了(其实是因为我的草稿本终于可以派上用场了斜率优化),于是就下定决心要学了。

其实蛮好理解的。假如给你一条直线y=kx+b,告诉你k,还有一些点,让你求过这些点的能得到的最大的b。

假如k<0,我们最后要用的点就是右图这样一个凸壳上的点。斜率优化

k>0同理。

假如k (<0) 不断变小,那我们选的点的横坐标也会不断变大。

于是,当我们在做dp题的时候,遇到各种各样奇葩的转移方程式的时候,就可以把转移方程转化为y=kx+b,求最大或最小的b的形式,然后看一看有没有上述性质(单调),如果有就可以斜率优化啦。。。


关于如何弄成那种形式。。我认为是这样的:

假如由dp[j]更新dp[i],所有和 j 无关的是b,所有与 i 无关的是y,剩下的是kx,其中的 k 是关于 i 的式子,随着 i 增大必须具有单调性。如果看着有点晕,拿一道题自己搞一搞就明白了。

于是写一个队列,维护一堆点,就可以啦。。。


下面附上几道水题。

由于本蒟蒻代码太丑,我就不贴代码了。

apio2010 特别行动队  

sdoi2016 征途

apio2014 序列分割

相关文章: