動態規劃 斜率優化

2021-09-05 09:16:16 字數 4054 閱讀 6765

一、引用

一般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...