1. 程式人生 > >「斜率優化」解析及例題

「斜率優化」解析及例題

連線 舉例 尋找 ... 畫面 節點 target 並且 tps

前言

  我們知道單調隊列可以用來優化動態規劃,當狀態轉移方程可以被表示為f[i] = (只與j有關的) + 一些常數 時便可以用單調隊列來保存j來O(1)完成尋找j的過程,因此將$O(n^2)$優化為了$O(n)$

  那麽如果當有一個轉移方程變為了f[i] = (f[j] + 與i有關的)^2 ...這種情況時,我們發現展開的時候有f[j]*s[i]這類的項,因此不能再用單調隊列直接來進行優化了,這時候就要用到斜率優化。

例題分析

  空說沒用,舉例來講吧:

  傳送門:>[HNOI2008]玩具裝箱TOY<

題意:給你n件物品,物品i被壓縮成一維以後長度為C[i]。現在你要把這些玩具按順序放進幾個一維容器中。其中制作一個長度為X的一維容器所需要的費用的是$(X-L)^2$。如果在一個一維容器中放入多個玩具,則每兩個相鄰的玩具之間要放進一個長度為1的東西用來隔離。想造幾個容器就造幾個容器。問把所有玩具裝好的最小費用。數據範圍$N \leq 50000$

  首先,很容易得出一個$O(n^2)$的轉移方程$$f[i] = f[j] + (sum[i] - sum[j] + i - (j+1)-L)^2$$

整理得$$f[i] = f[j] + (sum[i]+i-(sum[j]+j)-(L+1))^2$$

設$s[k] = sum[k] + k, L = L+1$,則$$f[i] = f[j] + (s[i]-(s[j]+L))^2$$

展開得$$f[i] = f[j] + s[i]^2 - 2 * s[i] * (s[j] + L) + (s[j] + L)^2$$

移項$$f[j]+s[i]^2+(s[j]+L)^2 = 2 * s[i] * (s[j] + L) + f[i]$$

  至此,我們已經將轉移方程做了一些改變。由於當前考慮i,我們可以把i作為已知量,未知的是j。因此可以將有關j的作為變量來得到一個直線方程(一次函數):

  $$f[j]+s[i]^2+(s[j]+L)^2 = 2 * s[i] * (s[j] + L) + f[i] \Longleftrightarrow y = kx + b$$

  因此,對於所有可供我們轉移的j都可以看做坐標$(s[j] + L, f[j]+s[i]^2+(s[j]+L)^2)$。同時我們容易發現,斜率是一個常數,我們要求的$f[i]$是該直線的截距

  所以我們的問題可以轉化成這樣:

    給出一條已知斜率的直線,求當該直線經過其中一個點時的最小截距。

  這個問題可以理解成:當一條直線從下往上平移時,碰到第一個點時的截距。

  很容易發現,這個點一定是最外層的點(也就是凸包上的點)。因此我們可以維護一個下凸包,並且可以保證,下凸包內相互連接的線段的斜率依次遞增。

  想象一下畫面,也很容易發現我們碰到的第一個點兩邊線段的斜率一定左邊小於他,右邊大於它。也就是說直線剛好頂在一個尖角上。

  因此只要求出這個尖角就好了。

  此時我們可以用單調隊列來維護。由於直線的斜率是$2 * s[i]$,所以依次考慮i時,斜率是不斷會遞增的。因此所有斜率小於當前直線的線段的左端點可以全部踢掉了,因為以後他們也不會再有用了。這就好像單調隊列一樣。好了,此時的那個點就是我們要找的那個點了。依據狀態轉移方程得到f[i],並且i作為一個新的點加入點的行列。此時還是像單調隊列一樣考慮。看看i能否放在目前維護的凸包的最後面,並且我們需要保證的是線段的斜率依次遞增。所以我們不斷判斷來踢出尾部的節點。踢出尾部節點的正確性也非常好證明:無論如何,由於i與結尾t的連線斜率較小,所以以後的直線肯定先碰到i再碰到t,並且i會永遠存在,所以t就不必要存在了。

  但是我們註意到了,在我們的y坐標中擁有$s[i]^2$,這就不僅僅與i有關了,還與i有關?其實這與i根本沒有關系,因為我們在算斜率時分子是兩個y坐標的差,而對於同一條直線,$s[i]^2$顯然是相等的,所以他們在做差時就會被減掉從而被抵消。更一般的,所有與j不想關的都會被減掉,無論是x坐標還是y坐標。所以本題的x,y坐標可以被改成$(s[j], f[j]+(s[j]+L)^2)$

總結

  現在對斜率優化動態規劃的題目做一個總結,如下:

  1. 依據題目,列出$O(n^2)$或更別的待優化的狀態轉移方程

  2. 對方程進行變形成為$y = kx + b$的形式,令截距為f[i]

  3. 得到x,y坐標,同時去除不與j相關的冗余項

  4. 考慮得到的截距是要最大還是最小,從而維護上凸包還是下凸包

  5. for循環,先踢出隊頭的,從而得到符合要求的進行轉移,再踢出隊尾的

  6. 輸出答案

「斜率優化」解析及例題