斜率優化dp學習


用了一堂半的課才徹底搞懂。其他神犇寫的博客或多或少有點小bug,所以orzzz不才斗膽重新寫一個。

里面大量穿用其他神犇的原話,就不逐一標明出處了。

引用資料 Accept的博客 MathonL的博客

 

 

首先是最經典的題的題面。

HDU 3507,很適合的一個入門題。

大概題意就是要輸出$N$個數字$a[N]$,輸出的時候可以連續連續的輸出,每連續輸出一串,它的費用是 “這串數字和的平方加上一個常數$M$”。

我們設$dp[i]$表示輸出到$i$的時候最少的花費,$S[i]$表示從$a[1]$到$a[i-1]$的數字和。注意這里為了方便起見前綴和與一般的有區別。

則有:$dp[i]=min \left\{ dp[j]+(S[i+1]-S[j])^2+M \right\} (j<i)$

復雜度顯然是$O(n^2)$的。對於$500000$的$n$顯然過不了。那么我們想,能否在$O(1)$時間內找到所有轉移里最優的那個呢?

我們假設在求解$dp[i]$時,存在$j,k(j>k)$使得從$j$轉移比從$k$轉移更優,那么需要滿足條件:

$dp[j]+(S[i+1]-S[j])^2+M<dp[k]+(S[i+1]-S[k])^2+M$

展開上式

$dp[j]+S[i+1]^2-2S[i+1]S[j]+S[j]^2+M<dp[k]+S[i+1]^2-2S[i+1]S[k]+S[k]^2+M$

移項並消去再合並同類項得

$dp[j]-dp[k]+S[j]^2-S[k]^2<2S[i+1](S[j]-S[k])$

把$S[j]-S[k]$除過去,得到

$\frac{dp[j]-dp[k]+S[j]^2-S[k]^2}{S[j]-S[k]}<2S[i+1]$

我們設$f[x]=dp[x]+S[x]^2$,就化成了

$\frac{f[j]-f[k]}{S[j]-S[k]}<2S[i+1]$

即當$(j>k)$時,若$\frac{f[j]-f[k]}{S[j]-S[k]}<2S[i+1]$,則$j$對更新$dp[i]$比$k$更新$dp[i]$優。

休息一下qwq。這個東西好像斜率。

當一個數的$dp$值求完了,它的$f$值也跟着確定,我們就可以在空間中繪制出點$(S[i],f[i])$。這個點代表已經求出$dp$值的一個點。

當我們要求解$dp[t]$時,如果可用的集合里存在這樣三個點,位置關系如圖所示:

那么顯然

$\frac{f[j]-f[k]}{S[j]-S[k]}>\frac{f[i]-f[j]}{S[i]-S[j]}$

這時候他們和$2S[t+1]$的關系有3種:

·$\frac{f[j]-f[k]}{S[j]-S[k]}>\frac{f[i]-f[j]}{S[i]-S[j]}>2S[t+1]$

那么$j$比$i$優,$k$比$j$優。

·$\frac{f[j]-f[k]}{S[j]-S[k]}>2S[t+1]>\frac{f[i]-f[j]}{S[i]-S[j]}$

那么$i$比$j$優,$k$比$j$優。

·$2S[t+1]>\frac{f[j]-f[k]}{S[j]-S[k]}>\frac{f[i]-f[j]}{S[i]-S[j]}$

那么$i$比$j$優,$j$比$k$優。

綜上,不管什么樣的$S[t+1]$,從$j$轉移都不會是最佳方案。那么用一個數據結構維護一個凸包(下凸),每加入一個點就刪去一些點,使其維持凸包的形態。最優轉移一定在這個凸包中。

但還是不能$O(1)$對吧。在凸包里,誰又是最最優呢?

首先一定數據結構里的凸包一定會是這樣的:

假設$\overrightarrow{ji}$的斜率$>2S[t+1]$且$\overrightarrow{kj}$的斜率$<2S[t+1]$從圖形特點我們可以發現$j$點比所有比$k$小的點都優,比所有比$i$大的也優。所以對於我們二分查找斜率比$2S[t+1]$小的編號最大的點,就是最優的轉移點。由於$S[i]$也滿足單調性,我們還可以直接維護一個單調隊列就能解決這個問題。

推廣一下,如果不等式右側不是像$S[i+1]$這樣的單調函數,二分就好了。

所有小於等於的情況我都沒提,想一想就知道了。重要的是思想啊對不對~

(我會說我一道斜率優化題都沒做就寫了這篇博客嗎


 

upd1:

光會思想沒有用啊,,,邊界條件的處理很蛋疼的說

還是要自己寫幾遍qwq

upd2:

更正了一個bug,由@Duan2baka發現。不好好女裝居然來看我這篇菜雞博客。

upd3:

dp式子都寫錯了。。。感謝@自為風月馬前卒指正

upd4:

我這bug也夠多了哈。。感謝@belief01指正

upd5:

又改了一處不嚴謹的地方,感謝@ToRe

如果影響大家曾經的閱讀深表歉意~雖然不是老師,但是千萬不要誤人子弟啊。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM