a. w ( i , j ) w(i,j) w(i,j)满足区间包含单调性
b. w ( i , i ) = 0 w(i,i)=0 w(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 1 1,假设 k k k是 f i f_i fi的最优决策点,假设 i ′ > i , k ′ < k i'>i,k'
对于式子 2 2 2,假设 p ( i , j ) p(i,j) p(i,j)是 f i , j f_{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 ′ < k p(i,j-1)=k,k' \lt k p(i,j−1)=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
给出 V V V个村庄的横坐标,从中选出 P P P个安放邮局,使得所有村庄去邮局距离之和最小。
当只安放一个邮局时候,显然只需选在中间点即可。
设 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 ( n 2 ) O(n^2) O(n2), w ( i , j ) = w ( i , j − 1 ) + ( x [ j + 1 ] − x [ y + 1 + x 2 ] ) 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个条件。
记 f i , j f_{i,j} fi,j表示在前 i i i个村庄安放 j j j个邮局,距离之和的最小值。
类似于序列化分问题,我们可以找到转移方程:
f i , j = m i n ( f k , 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维线性递推式的决策单调性证明方法,可以知道这个式子也可以使用四边形进行优化。