四边形不等式

四边形不等式

优化一种动态规划递推式:

  1. fi=min0≤j<i{fj+w(j+1,i)}f_i=min_{0\le j\lt i}\{f_j+w(j+1,i)\}fi=min0j<i{fj+w(j+1,i)} 典型题目:序列划分
  2. fi,j=mini≤k<j{fi,k+fk+1,j+w(i,j)}f_{i,j}=min_{i\le k \lt j}\{f_{i,k}+f_{k+1,j}+w(i,j)\}fi,j=minik<j{fi,k+fk+1,j+w(i,j)} 典型题目:石子合并

必须满足的条件:

a. w(i,j)w(i,j)w(i,j)满足区间包含单调性
b. w(i,i)=0w(i,i)=0w(i,i)=0
c. w(i,j)w(i,j)w(i,j)满足四边形不等式,即对于x≤x′<y≤y′x \le x' \lt y \le y'xx<yy,有w(x,y)+w(x′,y′)≤w(x,y′),+w(x′,y)w(x,y) + w(x',y') \le w(x,y'),+w(x',y)w(x,y)+w(x,y)w(x,y),+w(x,y)

决策单调性证明

1维递推式决策单调性证明

对于式子111,假设kkkfif_ifi的最优决策点,假设i′>i,k′<ki'>i,k'<ki>i,k<k,那么对于fi′f_{i'}fi来说,在kkk点决策优于在k′k'k点决策。

  1. 首先有1式:fi=fk+w(k+1,i)<fk′+w(k′+1,i)f_i=f_k+w(k+1,i) < f_{k'}+w(k'+1,i)fi=fk+w(k+1,i)<fk+w(k+1,i)
  2. 取点k′+1<k+1<i<i′k'+1 \lt k+1 \lt i \lt i'k+1<k+1<i<i,根据四边形不等式得2式:w(k′+1,i)+w(k+1,i′)<w(k′+1,i′)+w(k+1,i)w(k'+1,i)+w(k+1,i') \lt w(k'+1,i') + w(k+1,i)w(k+1,i)+w(k+1,i)<w(k+1,i)+w(k+1,i)
  3. 1式 + 2式可得3式:fk+w(k+1,i′)<fk′+w(k′+1,i′)f_k+w(k+1,i') \lt f_{k'} + w(k'+1,i')fk+w(k+1,i)<fk+w(k+1,i)
    根据3式,显然决策单调性满足。
2维递推式决策单调性证明

对于式子222,假设p(i,j)p(i,j)p(i,j)fi,jf_{i,j}fi,j的最优决策点,那么证明决策单调性即等价于证明p(i,j−1)≤p(i,j)≤p(i+1,j)p(i,j-1) \le p(i,j) \le p(i+1,j)p(i,j1)p(i,j)p(i+1,j)
先证明p(i,j−1)≤p(i,j)p(i,j-1) \le p(i,j)p(i,j1)p(i,j),右边同理。
证明方法:设是p(i,j−1)=k,k′<kp(i,j-1)=k,k' \lt kp(i,j1)=k,k<k

  1. kkk的最优性,得到1式fi,j−1=fi,k+fk+1,j−1+w(i,j−1)<fi,k′+fk′+1,j−1+w(i,j−1)f_{i,j-1}=f_{i,k} + f_{k+1,j-1}+w(i,j-1) \lt f_{i,k'} + f_{k'+1,j-1}+w(i,j-1)fi,j1=fi,k+fk+1,j1+w(i,j1)<fi,k+fk+1,j1+w(i,j1)
  2. 由于www满足四边形不等式,其实fff也满足四边形不等式,取k′+1<k+1<j−1<jk'+1 \lt k+1 \lt j-1 \lt jk+1<k+1<j1<j,由递变形不等式可得:fk′+1,j−1+fk+1,j<fk′+1,j+fk+1,j−1f_{k'+1,j-1}+f_{k+1,j} \lt f_{k'+1,j}+f_{k+1,j-1}fk+1,j1+fk+1,j<fk+1,j+fk+1,j1
  3. 1式+2式可得:fi,k+fk+1,j+w(i,j)<fi,k′+fk′+1,j+w(i,j)f_{i,k}+f_{k+1,j}+w(i,j) \lt f_{i,k'}+f_{k'+1,j}+w(i,j)fi,k+fk+1,j+w(i,j)<fi,k+fk+1,j+w(i,j)
    显然,对于fi,jf_{i,j}fi,j来说,决策点kkk要比k′k'k好,证明完毕。

于是石子合并的代码可以写成:

for(int i = 1;i <= n;++i) {
	dp[i][i] = 0;
	dp[i][i+1] = a[i] + a[i+1];
	p[i][i+1] = i;
}
for(int len = 3;len <= n;++len) 
	for(int i = 1;i <= n;++i) {
		int j = i + len - 1;
		if(j > n) break;
		for(int k = p[i][j-1],k <= p[i+1][j];++k) {
			int X = dp[i][k] + dp[k+1][j];
			if(X < dp[i][j]){
				dp[i][j] = X;
				p[i][j] = k;
			}
		}
	}
}

例题

http://poj.org/problem?id=1160

题目大意

给出VVV个村庄的横坐标,从中选出PPP个安放邮局,使得所有村庄去邮局距离之和最小。

解:

当只安放一个邮局时候,显然只需选在中间点即可。
w(i,j)w(i,j)w(i,j)表示把[i,j][i,j][i,j]区间内的村庄安置一个邮局,其最小距离和。
容易发现,w(i,j)w(i,j)w(i,j)可以用动态规划来求解,时间复杂度O(n2)O(n^2)O(n2)w(i,j)=w(i,j−1)+(x[j+1]−x[y+1+x2])w(i,j)=w(i,j-1)+(x[j+1]-x[\frac{y+1+x}{2}])w(i,j)=w(i,j1)+(x[j+1]x[2y+1+x]),发现w(i,j)w(i,j)w(i,j)满足四边形不等式等3个条件。

fi,jf_{i,j}fi,j表示在前iii个村庄安放jjj个邮局,距离之和的最小值。
类似于序列化分问题,我们可以找到转移方程:
fi,j=min(fk,j−1+w(k+1,i))f_{i,j}=min(f_{k,j-1}+w(k+1,i))fi,j=min(fk,j1+w(k+1,i)),根据1维线性递推式的决策单调性证明方法,可以知道这个式子也可以使用四边形进行优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值