四边形不等式
优化一种动态规划递推式:
- fi=min0≤j<i{fj+w(j+1,i)}f_i=min_{0\le j\lt i}\{f_j+w(j+1,i)\}fi=min0≤j<i{fj+w(j+1,i)} 典型题目:序列划分
- 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=mini≤k<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'x≤x′<y≤y′,有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,假设kkk是fif_ifi的最优决策点,假设i′>i,k′<ki'>i,k'<ki′>i,k′<k,那么对于fi′f_{i'}fi′来说,在kkk点决策优于在k′k'k′点决策。
- 首先有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)
- 取点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)
- 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,j−1)≤p(i,j)≤p(i+1,j)。
先证明p(i,j−1)≤p(i,j)p(i,j-1) \le p(i,j)p(i,j−1)≤p(i,j),右边同理。
证明方法:设是p(i,j−1)=k,k′<kp(i,j-1)=k,k' \lt kp(i,j−1)=k,k′<k
- 由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,j−1=fi,k+fk+1,j−1+w(i,j−1)<fi,k′+fk′+1,j−1+w(i,j−1)
- 由于www满足四边形不等式,其实fff也满足四边形不等式,取k′+1<k+1<j−1<jk'+1 \lt k+1 \lt j-1 \lt jk′+1<k+1<j−1<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,j−1+fk+1,j<fk′+1,j+fk+1,j−1。
- 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,j−1)+(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,j−1+w(k+1,i)),根据1维线性递推式的决策单调性证明方法,可以知道这个式子也可以使用四边形进行优化。