动态规划(四边形不等式优化)

文章详细证明了在满足特定区间单调性和四边形不等式的条件下,函数f(l,r)也遵循四边形不等式,并探讨了最优决策点的性质。通过数学归纳法展示了在不同情况下的不等式关系,进一步证明了相关性质的等价性。

状态转移方程

f(l, r)= min{f(l, k) + f(k + 1, r)} + w(l, r), l <= k < r

例子

https://www.luogu.com.cn/problem/P1775

设有N(N≤300)堆石子排成一排,其编号为1,2,3,⋯,N。每堆石子有一定的质量mi(mi≤1000)。现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻。合并时由于选择的顺序不同,合并的总代价也不相同。试找出一种合理的方法,使总的代价最小,并输出最小代价。

令f(i, j)表示第i到j堆合并的最小代价,w(i, j)表示第i到j堆的质量之和,状态转移方程为:

f(i, i) = 0, 0 <= i < N
f(i, j) = min{f(i, k) + f(k + 1, j)} + w(i, j), i <= k < j
vector<vector<int>> f(N, vector<int>(N, INT_MAX));

for (int i = 0; i < N; ++i) {
	f[i][i] = 0;
}

for (int len = 1; len < N; ++len) {
	for (int i = 0; i < N - len; ++i) {
		int j = i + len;
		for (int k = i; k < j; ++k) {
			if (f[i][k] + f[k + 1][j] + w[i][j] < f[i][j]) {
				f[i][j] = f[i][k] + f[k + 1][j] + w[i][j];
			} 
		}
	}
}

时间复杂度为O(n^3),在f(i, j)满足一定条件的情况下,时间复杂度可以优化到O(n^2)

四边形不等式

如果对于任意l1 <= l2 <= r1 <= r2,w(l, r)满足:
    区间包含单调性:w(l2, r1) <= w(l1, r2)
    四边形不等式:w(l1, r1) + w(l2, r2) <= w(l1, r2) + w(l2, r1)
那么f(l, r)满足:
    四边形不等式:f(l1, r1) + f(l2, r2) <= f(l1, r2) + f(l2, r1)

证明

1、l1 = l2或r1 = r2

显然成立

2、l1 < l2 = r1 < r2

u, v分别表示f(l1, r2), f(l2, r1)的最优决策点
l1 <= u < r2, l2 <= v < r1

(a) u < r1
f(l1, r1) <= f(l1, u) + f(u + 1, r1) + w(l1, r1) // l1 <= u < r1
f(l1, r1) + f(l2, r2) <= f(l1, u) + f(u + 1, r1) + w(l1, r1) + f(l2, r2)
                      <= f(l1, u) + f(u + 1, r2) + w(l1, r2) + f(l2, r1)
                       = f(l1, r2) + f(l2, r1)
其中:
f(u + 1, r1) + f(l2, r2) <= f(u + 1, r2) + f(l2, r1) // u + 1 <= l2 = r1 < r2
w(l1, r1) <= w(l1, r2)
数学归纳法,根据u + 1 <= l2 = r1 < r2推出l1 < l2 = r1 < r2

(b) u >= r1
f(l2, r2) <= f(l2, u) + f(u + 1, r2) + w(l2, r2) // l2 <= u < r2
f(l1, r1) + f(l2, r2) <= f(l1, r1) + f(l2, u) + f(u + 1, r2) + w(l2, r2)
                      <= f(l1, u) + f(l2, r1) + f(u + 1, r2) + w(l1, r2)
                       = f(l1, r2) + f(l2, r1)
其中:
f(l1, r1) + f(l2, u) <= f(l1, u) + f(l2, r1) // l1 < l2 = r1 <= u
w(l2, r2) <= w(l1, r2)
数学归纳法,根据l1 < l2 = r1 <= u推出l1 < l2 = r1 < r2

归纳过程如下:

(1)当[l1, l2]长度为0或[r1, r2]长度为0时,成立
(2)当[l1, l2]长度为1且[r1, r2]长度为1时,
	(a)u < r1,[u + 1, l2]长度为0,根据(1),成立
	(b)u >= r1,[r1, u]长度为0,根据(1),成立
(3)当[l1, l2]长度为1且[r1, r2]长度为2时,
	(a)u < r1,[u + 1, l2]长度为0,根据(1),成立
	(b)u >= r1,[r1, u]长度为0/1,根据(1)/(2),成立
(4)当[l1, l2]长度为2且[r1, r2]长度为1时,
	(a)u < r1,[u + 1, l2]长度为0/1,根据(1)/(2),成立
	(b)u >= r1,[r1, u]长度为0,根据(1),成立
(5)当[l1, l2]长度为2且[r1, r2]长度为2时,
	(a)u < r1,[u + 1, l2]长度为0/1,根据(1)/(3),成立
	(b)u >= r1,[r1, u]长度为0/1,根据(1)/(4),成立
...

3、l1 < l2 < r1 < r2

u, v分别表示f(l1, r2), f(l2, r1)的最优决策点
l1 <= u < r2, l2 <= v < r1

(a) u <= v
f(l1, r1) <= f(l1, u) + f(u + 1, r1) + w(l1, r1) // l1 <= u < r1
f(l2, r2) <= f(l2, v) + f(v + 1, r2) + w(l2, r2) // l2 <= v < r2
以上两式相加:
f(l1, r1) + f(l2, r2) <= f(l1, u) + f(u + 1, r1) + w(l1, r1) + f(l2, v) + f(v + 1, r2) + w(l2, r2)
                      <= f(l1, u) + f(u + 1, r2) + w(l1, r2) + f(l2, v) + f(v + 1, r1) + w(l2, r1)
                       = f(l1, r2) + f(l2, r1)
其中:
f(u + 1, r1) + f(v + 1, r2) <= f(u + 1, r2) + f(v + 1, r1) // u + 1 <= v + 1 <= r1 < r2
w(l1, r1) + w(l2, r2) <= w(l1, r2) + w(l2, r1)
数学归纳法,根据u + 1 <= v + 1 <= r1 < r2推出l1 < l2 < r1 < r2

(b) u > v
f(l1, r1) <= f(l1, v) + f(v + 1, r1) + w(l1, r1) // l1 < v < r1
f(l2, r2) <= f(l2, u) + f(u + 1, r2) + w(l2, r2) // l2 < u < r2
以上两式相加:
f(l1, r1) + f(l2, r2) <= f(l1, v) + f(v + 1, r1) + w(l1, r1) + f(l2, u) + f(u + 1, r2) + w(l2, r2)
                      <= f(l1, u) + f(u + 1, r2) + w(l1, r2) + f(l2, v) + f(v + 1, r1) + w(l2, r1)
                       = f(l1, r2) + f(l2, r1)
其中:
f(l1, v) + f(l2, u) <= f(l1, u) + f(l2, v) // l1 < l2 <= v < u
w(l1, r1) + w(l2, r2) <= w(l1, r2) + w(l2, r1)
数学归纳法,根据l1 < l2 <= v < u推出l1 < l2 < r1 < r2

归纳过程如下:

(1)当[l2, r1]长度为0时,成立
(2)当[l2, r1]长度为1时,
	(a)u <= v,[v + 1, r1]长度为0,根据(1),成立
	(b)u > v,[l2, v]长度为0,根据(1),成立
(3)当[l2, r1]长度为2时,
	(a)u <= v,[v + 1, r1]长度为0/1,根据(1)/(2),成立
	(b)u > v,[l2, v]长度为0/1,根据(1)/(2),成立
...

m(l, r - 1) <= m(l, r) <= m(l + 1, r)

如果f(l, r)满足:
    四边形不等式:f(l1, r1) + f(l2, r2) <= f(l1, r2) + f(l2, r1)
那么:
    m(l, r - 1) <= m(l, r) <= m(l + 1, r), 其中m(l, r)表示f(l, r)的最小最优决策点

证明

k1 = m(l, r - 1)
k = m(l, r)
k2 = m(l + 1, r)
证明k1 <= k <= k2

1、如果k < k1
    f(l, k) + f(k + 1, r) <= f(l, k1) + f(k1 + 1, r)
    f(k + 1, r - 1) + f(k1 + 1, r) <= f(k + 1, r) + f(k1 + 1, r - 1) // k + 1 < k1 + 1 <= r - 1 < r
    以上两式相加:
    f(l, k) + f(k + 1, r - 1) <= f(l, k1) + f(k1 + 1, r - 1)
    上式表示k是比k1更小的最优决策点,与k1是最小最优决策点矛盾,所以k >= k1

2、如果k > k2
    f(l + 1, k2) + f(k2 + 1, r) <= f(l + 1, k) + f(k + 1, r)
    f(l, k2) + f(l + 1, k) <= f(l, k) + f(l + 1, k2) // l < l + 1 <= k2 < k
    以上两式相加:
    f(l, k2) + f(k2 + 1, r) <= f(l, k) + f(k + 1, r)
    上式表示k2是比k更小的最优决策点,与k是最小最优决策点矛盾,所以k <= k2

所以k1 <= k <= k2

参考

https://blog.csdn.net/weixin_43914593/article/details/105150937

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值