演算法學習筆記之斜率優化
阿新 • • 發佈:2022-02-24
前言
近幾日迴歸競賽後,便開始學些新東西了(對於蒟蒻來說)。這幾天就連續的更新一下自己對斜率優化的學習過程。
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\)
2.實現
利用單調佇列維護當前的決策點構成的凸包,在遍歷到\(i\)時,先將斜率小於當前斜率的決策點全部刪去。然後對頭的點就是當前的最優決策點,更新當前值後,在隊尾加點時保證斜率的單調遞增即可。