斜率优化Convex Hull Trick
斜率優化
一、簡單DP
首先從一道簡單題引入。
[IOI2002]任務安排
Description
N個任務排成一個序列在一臺機器上等待完成(順序不得改變),這N個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是Ti。在每批任務開始前,機器需要啟動時間S,而完成這批任務所需的時間是各個任務需要時間的總和(同一批任務將在同一時刻完成)。每個任務的費用是它的完成時刻乘以一個費用系數ci。請確定一個分組方案,使得總費用最小。
例如:S=1;T={1,3,4,2,1};F={3,2,3,3,4}。如果分組方案是{1,2}、{3}、{4,5},則完成時間分別為{5,5,10,14,14},費用C={15,10,30,42,56},總費用就是153。
Input
第一行是N(1<=N<=5000)。
第二行是S(0<=S<=50)。
下面N行每行有一對數,分別為Ti和ci,均為不大于100的正整數,表示第i個任務單獨完成所需的時間是Ti及其費用系數ci。
Output
一個數,最小的總費用。
Sample Input
5
1
1 3
3 2
4 3
2 3
1 4
Sample Output
153
Solution
“光著身子”的動態規劃。
設F[i,j]表示劃分前i個任務為j批的最小費用。
?? ? ? ? ? ? ? ??
,時間復雜度:,空間復雜度:
這顯然是不夠的。
?
實際上我們不一定要知道之前劃分了多少批任務,只需要記錄F[i]表示劃分前i個任務的最小費用。
這樣就寫出了動態規劃方程。
二、簡單題2
將上題的n<=5000改為n<=300000。
Solution
這就是本文的重點所在了。
在上文中的動態規劃中,尚有兩種簡單的優化思路:
顯然,優化狀態很難達成,那么我們考慮優化轉移。
我們可以發現在轉移的過程中有很多的不必要的轉移:
考慮一下兩個轉移:
在此題中,若?
那么轉移 j 就是不必要的。
也就是說,若有且選取轉移狀態的集合
并且存在,后面的轉移比前面的優,則前面的轉移就是無意義的,也就是對最終答案無貢獻的了。
?
考慮本題,如何判斷轉移狀態是否是有用的呢?
也就是說,如果?
那么后面的轉移比前面的優,否則前面的轉移比后面的優。
這樣的,即是用斜率的形式,表現了轉移之間的不必要的關系。
?
進一步,我們發現:
也就是說,如果當前存在后面的轉移比前面的優,那么這個轉移在之后的狀態中都不會成為最有轉移!
根據這個性質,我們選擇用單調隊列維護一個兩點間斜率單調遞增的點集隊列。
設:
最后的點集隊列滿足:在隊首的點的轉移必然是最優的。
于是
將轉移化為,動態規劃完成。
三、簡單題3
若 ? -512<=t[i]<=512 ,也就是說:
? ??不再成立怎么辦呢?
我們發現:
這一性質依然成立,那么這個點集集合還是會組成一個相鄰點斜率遞增的單調隊列。
有 ??
發現:
也就是說,答案一定存在于一個點,使得???且???
那么必然最優。
我們可以維護單調隊列,只在隊尾刪除,每次二分查詢一個最優點。
這樣便是的斜率優化做法。
?
四、簡單題4
一種形式斜率優化的形式:
隊列中的點不滿足單調性。
BZOJ1492: [NOI2007]貨幣兌換Cash
題目描述:詳見BZOJ。
這一題就是典型的例子。
斜率不單調,那么就必須用cdq分治或splay維護斜率凸包解決斜率優化問題了。
下次有時間再補充。。。
總結
以上是生活随笔為你收集整理的斜率优化Convex Hull Trick的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冬瓜皮的功效与作用、禁忌和食用方法
- 下一篇: [COCI 2017-2018-2]-S