1. 程式人生 > 其它 >演算法學習筆記之斜率優化

演算法學習筆記之斜率優化

前言

近幾日迴歸競賽後,便開始學些新東西了(對於蒟蒻來說)。這幾天就連續的更新一下自己對斜率優化的學習過程。

1.思想

在一些常見的DP題中,可能會出現形如\(f[i]=\min/\max(f[j]+(sum[i]-sum[j])^2\)的轉移方程式。
這時,我們就可以把後面的二次項展開:

\(f[i]=f[j]+sum[i]^2+sum[j]^2+2*sum[i]*sum[j]\)

\(f[j]+sum[j]^2=2*sum[i]*sum[j]+sum[i]^2+f[i]\)

再將\(2*sum[i]\)看做斜率,\(f[j]+sum[j]\)看做\(y\)\(sum[j]\)看做\(x\)

,則\(f[i]+sum[i]^2\)就成了截距,由於斜率不變,我們就用一個單調佇列來維護之前的決策點,再將該斜率的直線從下到上平移,找到斜率最小的點。所以我們既要維護一個下凸包。

2.實現

利用單調佇列維護當前的決策點構成的凸包,在遍歷到\(i\)時,先將斜率小於當前斜率的決策點全部刪去。然後對頭的點就是當前的最優決策點,更新當前值後,在隊尾加點時保證斜率的單調遞增即可。