動態規划之四邊形不等式優化


四邊形不等式

設函數\(w(x,y)\)是定義在\(Z\)上的函數,若對於任意\(a,b,c,d \in Z\),其中\(a\leq b \leq c \leq d\), 都有\(w(a,d)+w(b,c)\ge w(a,c)+w(b,d)\),則稱函數\(w\)滿足四邊形不等式

推論:

設函數\(w(x,y)\)是定義在\(Z\)上的函數,若對於任意\(a,b \in Z\),其中\(a<b\), 都有\(w(a,b+1)+w(a+1,b) \ge w(a,b)+w(a+1,b+1)\),則函數\(w\)滿足四邊形不等式

證明:

對於\(a<c\),有:

\[w(a,c+1)+w(a+1,c) \ge w(a,c)+w(a+1,c+1) \]

對於\(a+1<c\),有:

\[w(a+1,c+1)+w(a+2,c) \ge w(a+1,c)+w(a+2,c+1) \]

兩式相加,得:

\[w(a,c+1)+w(a+1,c)+w(a+1,c+1)+w(a+2,c)\ge w(a,c)+w(a+1,c+1)\\ +w(a+1,c)+w(a+2,c+1) \]

整理得:

\[w(a,c+1)+w(a+2,c)\ge w(a,c)+w(a+2,c+1) \]

依此類推,對於任意\(a\leq b \leq c\),有:

\[w(a,c+1)+w(b,c)\ge w(a,c)+w(b,c+1) \]

(此處即用\(b\)來代替\(a+2\),因為\(a+1 <c\) ,所以\(b \leq c\)

同理,對於任意\(a\leq b \leq c \leq d\),有:

\[w(a,d)+w(b,c)\ge w(a,c)+w(b,d) \]

定理1

對於任意\(a,b,c,d \in Z\),如果函數\(w\)滿足四邊形不等式,且\(w(a,d)\ge w(b,c)\),則函數\(f\)也滿足四邊形不等式,其中\(f\)滿足:

\[f(x,y)=min(f(x,z)+f(z+1,y)+w(x,y)|x\leq z <y) \]

(特別的,我們令\(f(x,y)=w(x,y)=0\)

證明:

\(x+1=y\)時,我們有:

\[f(x,y+1)+f(x+1,y)=f(x,x+2)+f(x+1,x+1)=f(x,x+2) \]

\(f(x,x+2)\)的最優決策是\(x+1\),則:

\[f(x,x+2)=f(x,x+1)+f(x+2,x+2)+w(x,x+2)=w(x,x+1)+w(x,x+2) \]

顯然

\[w(x,x+1)+w(x,x+2)\ge w(x,x+1)+w(x+1,x+2) \]

\(f(x,x+2)\)的最優決策是\(x\),則:

\[f(x,x+2)=f(x,x)+f(x+1,x+2)+w(x,x+2)=w(x+1,x+2)+w(x,x+2) \]

顯然

\[w(x+1,x+2)+w(x,x+2)\ge w(x+1,x+2)+w(x,x+1) \]

\[w(x,x+1)+w(x+1,x+2)=f(x,x+1)+f(x+1,x+2)=f(x,y)+f(x+1,y+1) \]

所以當\(x+1=y\) 時,我們得到:

\[f(x,y+1)+f(x+1,y)\ge f(x,y)+f(x+1,y+1) \]

即此時四邊形不等式成立。

接下來,我們運用數學歸納法

假設當\(y-x<k\)時,四邊形不等式成立。

我們現在考慮\(y-x=k\)的情況

\(f(x,y+1)\)\(a\)為最優決策,\(f(x+1,y)\)\(b\)為最優決策。

不妨設\(x+1\leq a \leq b\)

易得:

\[f(x,y+1)+f(x+1,y)=f(x,a)+f(a+1,y+1)+w(x,y+1)\\ +f(x+1,b)+f(b+1,y)+w(x+1,y) \]

對於\(f(x,y)\)\(f(x+1,y+1)\),由於\(a\)\(b\)不一定是最優決策,所以我們有:

\[f(x,y)+f(x+1,y+1)\le f(x,a)+f(a+1,y)+w(x,y)\\ +f(x+1,b)+f(b+1,y+1)+w(x+1,y+1) \]

因為\(w\)滿足四邊形不等式,所以:

\[w(x,y+1)+w(x+1,y)\ge w(x,y)+w(x+1,y+1) \]

根據歸納假設,我們有:

\[f(a+1,y+1)+f(b+1,y)\ge f(a+1,y)+f(b+1,y+1) \]

於是我們有:

\[f(x,y+1)+f(x+1,y)\ge f(x,y)+(x+1,y+1) \]

定理2:

對於任意\(a,b,c,d \in Z\),如果函數\(w\)滿足四邊形不等式,且函數\(f\)滿足:

\[f(x,y)=min(f(x,z)+f(z+1,y)+w(x,y)|x\leq z <y) \]

(特別的,我們令\(f(x,y)=w(x,y)=0\)

\(P(x,y)\)為令\(f(x,y)\)取到最小值的\(k\)值。如果函數\(f\)滿足四邊形不等式,那么對於任意\(x\)\(y\),我們有:

\[P(x,y-1)\leq P(x,y)\leq P(x+1,y) \]

證明:

\(p=P(i,j)\)

對於任意的\(x< k \leq p\),由四邊形不等式得:

\[f(x,t)+f(x+1,k)\ge f(x,k)+f(x+1,t) \]

移項得:

\[f(x+1,k)-f(x+1,t)\ge f(x,k)-f(x,t) \]

由於\(p\)為最優決策,所以我們有:

\[f(x,k)+f(k+1,y)\ge f(x,p)+f(p+1,y) \]

所以:

\[\begin{array}{lcr} (f(x+1,k)+f(k+1,y)+w(x+1,y))-(f(x+1,p)+f(p+1,y)+w(x+1,y))\\ =(f(x+1,k)-f(x+1,p))+(f(k+1,y)-f(p+1,y)) \\ \ge (f(x,k)-f(x,p))+(f(k+1,y)-f(p+1,y)) \\ =(f(x,k)+f(k+1,y))-(f(x,p)+f(p+1,y))\\ \ge 0 \end{array} \]

這意味着,對於\(f(x+1,y)\) 的任意決策\(k\leq p\)\(p\)都要比\(k\)更優(包括相等)

所以

\[P(x+1,y)\ge P(x,y) \]

同理可證

\[P(x,y-1)\leq P(x,y) \]

所以

\[P(x,y-1)\leq P(x,y) \leq P(x+1,y)) \]

例題

1.[NOI1995]石子合並

現在有\(n\)堆石子(環狀), 每次只能將相鄰的兩堆合並成一堆,每次的得分是兩隊石子之和,求最大得分和最小得分

顯然,本題是區間dp。

\(dp[i][j]\)表示\(i\)\(j\)之間合並石子的最小值(最大值同理),則我們可以很輕松地列出狀態轉移方程為:

\[dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+d(i,j)|i\leq k < j) \]

其中\(d(i,j)\)表示\(i\)\(j\)之間石子的個數

當問題是最小值時,我們就可以用四邊形不等式優化了。此時,對於\(dp[i][j]\),我們只需要在區間\([P[i][j-1],P[i+1][j]]\)枚舉\(k\)即可,時間復雜度為\(O(n^2)\)

注意:最大值並不滿足單調性,不能用四邊形不等式優化,但此時最大值有一個性質:

使最大值最優的決策\(P[i][j]\)要么是\(i\),要么是\(j-1\)

證明:

反證法。

假設最優決策\(P[i][j]=p\),且\(i<p<j-1\)

我們有兩種情況:

情況一:\(d(i,p)\leq d(p+1,j)\)

我們可以令\(t=P[i][p]\),於是此時我們的方案便是:

\({[i,i+1,i+2,...,t|t+1,t+2,...,p]p+1,p+2,...j}\)

得分\(F_1=(dp[i][t]+dp[t+1][p]+d(i,p))+dp[p+1][j]+d(i,j)\)

此時我們可以構造一種方案:

\({i+1,i+2,...,t[t+1,t+2,...,p|p+1,p+2,...j]}\)

得分\(F_2=dp[i][t]+(dp[t+1][p]+dp[p+1][j]+d(t+1,j))+d(i,j)\)

因為\(t<p\),所以\(d(i,p)\leq d(p+1,j< d(t+1,j)\)

所以\(F_1< F_2\),即此時決策\(p\)並不是最優

情況二:\(d(i,p)>d(p+1,j)\)

同樣的,我們令\(t=P[p+1][j]\),此時我們的方案:

\({i,i+1,i+2,...,p[p+1,p+2,...,t|t+1,t+2,...j]}\)

得分\(F_1=dp[i][p]+(dp[p+1][t]+dp[t+1][j]+d(p+1,j))+d(i,j)\)

我們仍然可以構造一種方案:

\({[i,i+1,i+2,...,p|p+1,p+2,...,t]t+1,t+2,...j}\)

得分\(F_2=(dp[i][p]+dp[p+1][t]+d(i,t+1))+dp[t+1][j]+d(i,j)\)

因為\(t+1>p\),所以\(d(i,t+1)>d(i,p)>d(p+1,j)\)

所以\(F_1<F_2\),即此時決策\(p\)仍然不是最優

這與假設矛盾,所以最優決策只可能是\(i\)或者$j-1 $

Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int dp[maxn][maxn];
int dp2[maxn][maxn];
int n;
int a[maxn];
int sum[maxn];
int p[maxn][maxn];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i+n]=a[i];
	for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+a[i],p[i][i]=i;
	for(int i=n<<1;i>=1;i--)
		for(int j=i+1;j<=n<<1;j++){
			dp[i][j]=0x3f3f3f3f;
			dp2[i][j]=max(dp2[i][i]+dp2[i+1][j],dp2[i][j-1]+dp2[j][j])+sum[j]-sum[i-1];
			for(int k=p[i][j-1];k<=p[i+1][j];k++)
				if(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]<dp[i][j]){
					dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1];
					p[i][j]=k;
				}else if(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]==dp[i][j])
					p[i][j]=max(p[i][j],k);
			
		}
	int ans=0x3f3f3f3f;
	int ans2=0;
	for(int i=1;i<=n;i++) ans=min(ans,dp[i][i+n-1]);
	for(int i=1;i<=n;i++) ans2=max(ans2,dp2[i][i+n-1]); 
	printf("%d\n%d\n",ans,ans2);
	return 0;
}

參考文獻:
1.李煜東《算法競賽進階指南》
2.2001年國家集訓隊論文 毛子青《動態規划算法的優化技巧》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM