一、引用
一般dp
方程可以轉化成
dp[i]=f[j]+x[i]
的形式,其中
f[j]
中儲存了只與
j相關的量。這樣的
dp方程可以用單調佇列進行優化,從而使得
o(n^2)
的複雜度降到
o(n)
。可是並不是所有的方程都可以轉化成上面的形式,舉個例子:
dp[i]=dp[j]+(x[i]-x[j])*(x[i]-x[j])
。如果把右邊的乘法化開的話,會得到
x[i]*x[j]
的項。這就沒辦法使得
f[j]
裡只存在於
j相關的量了。於是上面的單調佇列優化方法就不好使了。這裡可以考慮另一種優化方法——斜率優化。
二、分析
形如下面這樣的
dp方程f[i]=min,a[i]是和
i有關的函式,
x[j],b[j]是和j
有關的函式或常數,求解這個問題樸素是
o(n^2)
的,可以將它優化到
o(n)
或o(nlogn),可以把它改寫成:-a[i]*x[j]+f[i]=b[j](聯想一元一次方程:
y=k*x+b
),把-a[i]
看做斜率,
f[i]
看做截距,每乙個決策相當於平面上乙個點,最優決策顯然在平面點集的凸包上,要求
f[i]
的最小值,就相當於將一條斜率為
-a[i]
的直線不斷向上平移,碰到的第乙個點就是截距最小的點,也就是
f[i]
的最優決策
①如果橫座標和斜率均單調:就可以維護乙個單調佇列(斜率是單調的,即最優解也是單調的,類似於決策單調),隊首指標不斷往後走,每個點只會訪問一次,複雜度為o(n)
②如果均不單調:可以排序使得其中乙個單調,否則無法用斜率優化的dp做
以上說的是取min,那麼維護的是下凸殼,取max的話是維護上凸殼
如果方程是f[i]=min的話,可以將其變為f[i]=min(a[i]/b[i]*x[j]+y[j])*b[i]
三、應用
斜率優化,亦就是說把決策與決策之間表示成乙個類似斜率(y1-y2)/(x1-x2)的式子,進一步分析其中的單調性,並用佇列維護其有用決策。因此斜率優化又稱為佇列優化。
例1.
usaco
土地購買
acquire
【問題描述】給出n
個w*h
的矩形,把矩陣任意分組,每組的費用為組內最大長與最大寬的乘積
maxw*maxh
,問最小費用是多少。
【分析】
可以容易想到若wj<=wi且hj<=hi則j可以不考慮,然後按w公升序排序且同時h滿足單調下降,dp求最小費用,用f(i)記錄前i個矩形分組的最小費用,則有:f[i]=min(f[j]+w[j+1]*h[i]),j=1..i-1(w[j+1]為本組最寬的,h[i]為本組最高的)
但這樣會超時,需要優化:
左圖為原矩形排列,右圖紅框表示以i結束的最優分組,思考:藍框會是i+1的最優分組嗎?答案是不會的。
若藍框是i+1的最優分組,則:f[j-1] + w[j]*h[i+1] < f[j] + w[j+1]*h[i+1] ①
而由紅框是i的最優分組,有:f[j] + w[j+1]*h[i] < f[j-1] + w[j]*h[i] ②
聯立①②,得:w[j]*h[i+1] + w[j+1]*h[i]
但這明顯與四邊形不等式矛盾,也就是說:最優決策j具有單調性。
進一步觀察:設j和k是不同的兩種決策,設j
例2.
鋸木廠選址
ceoi2004
【問題描述】
山上有n棵樹呈直線分布,質量為w[1..n],離1號樹的距離為d[1..n],現在山底有一伐木場,且準備在山上建第二個伐木場,問建在**運輸木材的費用最低。1單位費用=1單位質量*1單位距離。
【分析】
容易想到伐木場從不建在兩樹間,於是設sumw[i]為1..i的質量和,c[i]為1..i運到i的費用,w[i,j]為j+1..i 運到i的費用,於是容易得到:
sumw[i] = ∑(j=1..i)w[j] ①
c[i] = ∑(j=1..i)w[j] * (d[i] - d[j]) ②
= c[i-1] + sumw[i-1] * (d[i] - d[i-1])
w[i,j] = c[i] - c[j] - sumw[j] * (d[i] - d[j]) ③
設f(i)為第二個伐木場在i的最小費用,於是有:
f(i)=min( c[j] + w[i,j] + w[n+1,i] ) (j=1..i-1) ④
和上一題相似,設j,k是兩個不同的決策
c[j] + w[i,j] + w[n+1,i]
若⑤成立則j優,否則k優。
把 ③ 代入 ⑤ 並展開化簡得: (sumw[j]*d[j] - sumw[k]*d[k]) / (sumw[j] - sumw[k]) > di ⑥
設g(j,k)為不等式⑥的左邊,其意義為:(sumw[j], sumw[j]*d[j])與(sumw[k], sumw[k]*d[k])連線的斜率,若g(j,k)>di,則對於i而言j比k更優。與上一題相似也是把(sumw[j],sumw[j]*d[j])放入乙個佇列,並維護其單調性。
例3.
貨幣兌換
boi2003
【問題描述】
n天內分別獲得a[1..n]的a幣(a[i]∈z),第i天a幣兌換為b幣的匯率為1a:ib,每次兌換收手續費tb,問n天後全部兌換成b幣最多是多少。
【分析】
設s[1..n]為a[1..n]的部分和陣列,很容易寫出方程:
f[i]=max(f[j]+(s[i]-s[j])*i-t)
但這會超時,能否像上面幾題優化呢?答案是還不行的,由於a[i]∈z,也就是說s沒有單調性,會出現的問題是:維護佇列單調性時,新插入的點也許會到了折線的中間,從而無法維護。
這個方法似乎就這樣被否定了,但實際並非如此:
觀察到1a:ib,也就是說a幣越往後越值錢,設在某個兌換點時兌換的金額為ma,①若m>0,可以留到下乙個兌換點兌換,這樣不僅兌換b幣更多,而且省下t b的手續費;②若m<0,是否應該立刻換成b幣以防止a幣公升值虧得更多呢?也不,還要考慮手續費t b的存在,這時就要dp處理了。
也就是說,當∑(k=i..j)a[k]>0時,i..j不可能成為兌換點(留到明天更值錢),否則需要再考慮是否兌換(考慮t b的存在),於是,我們可以把s[1..n]壓縮一下成為s'[1..n],其中s'[1..n-1]滿足恒為負且單調遞減,於是就可以用斜率優化解決了。
四、小結
斜率優化是一種廣泛應用於
dp以及
dp以外的優化方法,一般因其最優決策具有單調性,在進行第
i次決策時可以利用前面已得到的資訊以減少不必要的冗餘計算。減少冗餘的思想很重要。
斜率優化還蘊含著一種數形結合的思想,一般對於每乙個決策可看成平面上的點,兩點間的斜率體現出兩決策間的優劣關係,維護佇列單調性在圖形上就相當於維護乙個單調上
/下凸折線。
通過學習斜率優化,給了我們一種新的思路:像
<
貨幣兌換
>
一題,看上去和斜率優化存在極嚴重的矛盾,但通過仔細觀察、分析,可以把原題等價轉化,而得到一些新的性質,以滿足特定的需要。
斜率優化動態規劃
fi min fj s i2 sj l 2 2 si s j l fi min f j s i2 sj l 2 2si sj l 形如這個式子關於i的項與關於j的項混雜 相乘 的狀態轉移方程,可以使用斜率優化來加速 接下來以優化這個式子為例說說斜率優化.將上方給出的式子去掉 min min,僅關於j...
動態規劃 單調斜率優化DP
acwing 1087.修剪草坪 旅行商問題 輸入樣例 641 351 23 輸出樣例 acwing 1087.修剪草坪 動態規劃 f i max f i 1 f i j 1 sum i j sum i f i 表示從前i個中選,且合法的方案數。令x i j,則有 f i min f i 1 f x...
演算法 動態規劃之斜率優化
斜率優化通常使用單調佇列輔助進行實現,用於優化 dp 的時間複雜度。使用單調佇列優化 dp 通常可以解決型如 dp i min f j g i 的狀態轉移方程。其中 f i 是只關於 i 的函式,g j 是只關於 j 的函式。樸素的解決方法是在第二層迴圈中列舉 j 來實現最小值,時間複雜度為 o n...