決策單調性 四邊形不等式

2021-09-05 08:48:07 字數 2999 閱讀 9381

#include#define maxn 10000+10

using namespace std;

int dp[maxn][maxn],s[maxn][maxn],cnt[maxn];

int main()

}dp[i][j]=temp;

s[i][j]=te;}}

cout《題目:

n 堆石子。現要將石子有次序地合併成一堆,規定每次只能選相鄰的2 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併得分。設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分

演算法:(注:**石子首尾不連線)

設dp(i,j)定義為第i堆石子到第j堆石子合併後的最少總分數,想到這樣dp轉移 

dp[i][j]=min+cost[i][j] 

cost[i][j]表示把第i堆到第j堆的石子和到一起的最後一步的代價,顯然之前無論怎麼合併,最後一步的代價都是一樣的,所以我們可以先預處理出這個cost陣列,他等於cnt[j]-cnt[i-1],其中cnt陣列是字首和,然後用四邊形不等式優化

合併石子問題

現在有n堆石子,要將石子按一定順序地合成一堆,規定如下,每次只能移動相鄰的兩堆石子,合併費用為新和成一堆石子的數量,求把n堆石子全部合併到一起所花的最少或者最大花費

很容易想到這樣乙個dp轉移 

dp[i][j]=min+cost[i][j] 

震驚!這不就是之前所講的模型嘛?原來之前o(n^3)方的合併石子問題還可以優化(我太弱了) 

首先明確一點,cost[i][j]表示把第i堆到第j堆的石子和到一起的最後一步的代價,顯然,之前無論怎麼合併,最後一步的代價都是一樣的,所以我們可以先預處理出這個cost陣列,他等於cnt[j]-cnt[i-1],其中cnt陣列是字首和 

for一遍i,for一遍j,每算一次dp[i][j]還要for一遍k,自然是o(n^3)方,現在我們來按照規則判斷是否可以用四邊形優化

第一步(壹)證明cost為凸

對於所有的i,j,令其滿足i< i+1<=j< j+1 

我們需要證明 

cost[i][j]+cost[i+1][j+1]<=cost[i+1][j]+cost[i][j+1] 

移項 cost[i][j]-cost[i+1][j]<=cost[i][j+1]-cost[i+1][j+1] 

令f(j)=cost[i][j]-cost[i+1][j] 

f(j)=cnt[j]-cnt[i-1]-(cnt[j]-cnt[i]) 

f(j)=cnt[i]-cnt[i-1] 

都跟j無關了,自然一定滿足四邊形不等式(這個時候是直接等於了,但沒有違反四邊形不等式)

第二步(貳)證明dp為凸

要推導dp[i][j]的凸性,自然要滿足對任意的i,j,令i< i+1<=j< j+1 

有如下結論 

dp[i][j]+dp[i+1][j+1]<=dp[i+1][j]+dp[i][j+1] 

令dp[i+1][j]取得最優值的時候k=x 

令dp[i][j+1]取得最優值的時候k=y 

令x < =y(之後還要令x > y,這裡不再贅述,讀者如有興趣可以自行推導,方式相似) 

將k=x代入dp[i][j],k=y代入dp[i+1][j+1] 

左式=dp[i][x]+dp[x+1][j]+cost[i][j]+dp[i+1][y]+dp[y+1][j+1]+cost[i+1][j+1]① 

而對於i< i+1<=j< j+1 

由於已經在壹中證明了cost的凸性,所以 

cost[i][j]+cost[i+1][j+1]<=cost[i+1][j]+cost[i][j+1]② 

我們會發現這個不等式的左邊在①式中出現過,所以把②式中的左式和右式替換一下可以得到如下結論 

dp[i][x]+dp[x+1][j]+cost[i][j]+dp[i+1][y]+dp[y+1][j+1]+cost[i+1][j+1] 

<=

dp[i][x]+dp[x+1][j+1]+cost[i][j+1]+dp[i+1][y]+dp[y+1][j]+cost[i+1][j]

即dp[i][j]+dp[i+1][j+1]<=dp[i][j+1]+dp[i+1][j] 

證畢第三步(叄)證明決策單調

現在我們已經證明了cost陣列和dp陣列的凸性,要證明決策單調以證明優化的正確性 

即要證明s[i][j-1]<=s[i][j]<=s[i+1][j] 

對於s[i][j-1]<=s[i][j] 

令dp[i][j-1]取得最小值時的k=y,對於所有x≠y,令x<=y 

可以有如下推導 

∵x+1<=y+1<=j-1< j 

四邊形不等式有: 

dp[x+1][j-1]+dp[y+1][j]<=dp[y+1][j-1]+dp[x+1][j]

在式子兩邊同時加上dp[i][x]+cost[i][j-1]+dp[i][y]+cost[i][j] 可以得到

dp[i][x]+dp[x+1][j-1]+cost[i][j-1]+dp[i][y]+dp[y+1][j]+cost[i][j] 

<= 

dp[i][x]+dp[x+1][j]+cost[i][j]+dp[i][y]+dp[y+1][j-1]+cost[i][j-1]

dp[i][j-1]+dp[i][j]<=dp[i][j]+dp[i][j-1] 

(k=x)…………(k=y)……(k=x)……(k=y) 

移項dp[i][j-1]-dp[i][j-1]<=dp[i][j]-dp[i][j] 

(k=x)…………(k=y)……(k=x)……(k=y)

由於我們是令k=y時dp[i][j-1]取得最小值,那麼dp[i][j-1] (k=x)一定大於等於dp[i][j-1] (k=y),所以左式大於零,所以右式也大於零,所以對於dp[i][j-1]可以取到最優值的y,所有小於它的值,對於dp[i][j]來說,都沒有y優,所以最優決策一定不是小於y的,如果令s[i][j]表示dp[i][j]取得最優值的時候的k值,那麼一定有 

s[i][j-1]<=s[i][j] 

證畢 

四邊形不等式與決策單調

目錄一維線性dp的優化 二維區間遞推優化 定義存在二元函式 w x,y 其定義域為 i 若對於任意 a,b,c,d in i且a b c d w a,d w b,c w a,c w b,d 恆成立 則稱 w 滿足四邊形不等式。判定定理 若對於任意 a,b in i且a b w a,b 1 w a 1...

四邊形不等式

總結一下最近幾天對dp優化中的四邊形不等式的學習。證明什麼的似懂非懂,我還是太年輕了。第一種,n 2 nlogn 例題 由於許可權問題 不公開題面 就是1個體積均為1 300,100000個物品,做乙個100000的揹包。發現體積最多只有 300 種,分開做。對於同種體積的物品,顯然按照價值從大到小...

四邊形不等式

若有函式 a i,j 令 i,若有 a i j a i 1 j 1 le a i j 1 a i 1 j 則我們稱函式 a 滿足四邊形不等式。若我們在 dp 過程中會用到類似如下形式的方程 dp i j min dp k j or dp i k dp k 1 j w i j 那麼,只要代價函式 w ...