幾個月前剛開始被拉去和高二一起學這個東西,感覺好高大上啊。。。
然後前幾天碰到一道,覺得似乎可以理解一些了(其實是因爲我的草稿本終於可以派上用場了),於是就下定決心要學了。
其實蠻好理解的。假如給你一條直線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 增大必須具有單調性。如果看着有點暈,拿一道題自己搞一搞就明白了。
於是寫一個隊列,維護一堆點,就可以啦。。。
由於本蒟蒻代碼太醜,我就不貼代碼了。