式子
对于 ∀ a ≤ b ≤ c ≤ d \forall a≤b≤c≤d ∀a≤b≤c≤d,满足 w ( a , c ) + w ( b , d ) ≤ w ( a , d ) + w ( b , c ) w(a,c)+w(b,d)≤w(a,d)+w(b,c) w(a,c)+w(b,d)≤w(a,d)+w(b,c)
用途
一般是对DP的优化
说明一点,扩,扩充在这里的意思是:
目前有一个不等式
a
≤
b
a≤b
a≤b,已知
b
≤
c
b≤c
b≤c,则该不等式改写为
a
≤
c
a≤c
a≤c
证明
定理1
f
[
i
,
j
]
=
m
i
n
(
f
[
i
,
k
]
+
f
[
k
+
1
,
j
]
+
w
(
i
,
j
)
)
f[i,j]=min(f[i,k]+f[k+1,j]+w(i,j))
f[i,j]=min(f[i,k]+f[k+1,j]+w(i,j))
若w满足区间包含单调性和四边形不等式,
则f也满足区间包含单调性和四边形不等式
注意边界!
f
[
i
]
[
i
]
=
0
,
f
[
i
]
[
j
]
=
0
,
(
i
>
j
)
f[i][i]=0,f[i][j]=0,(i>j)
f[i][i]=0,f[i][j]=0,(i>j)
证明
这里的方法是,不断地凑式子,比如A<=B<=C。B是通过A凑出来的,C是通过B凑出来的。
区间包含单调性
∀
a
≤
b
≤
c
≤
d
\forall a≤b≤c≤d
∀a≤b≤c≤d,满足
w
(
a
,
d
)
≥
w
(
b
,
c
)
w(a,d)≥w(b,c)
w(a,d)≥w(b,c)
f的区间包含单调性?
令
i
≤
i
′
≤
k
≤
j
′
≤
j
i≤i'≤k≤j'≤j
i≤i′≤k≤j′≤j
f
[
i
]
[
j
]
=
m
i
n
f
[
i
]
[
k
]
+
f
[
k
+
1
]
[
j
]
+
w
(
i
,
j
)
f[i][j]=min{f[i][k]+f[k+1][j]}+w(i,j)
f[i][j]=minf[i][k]+f[k+1][j]+w(i,j)
f
[
i
′
]
[
j
′
]
=
m
i
n
f
[
i
′
]
[
k
]
+
f
[
k
+
1
]
[
j
′
]
+
w
(
i
′
,
j
′
)
f[i'][j']=min{f[i'][k]+f[k+1][j']}+w(i',j')
f[i′][j′]=minf[i′][k]+f[k+1][j′]+w(i′,j′)
通过归纳法,可知
f
[
i
]
[
k
]
≥
f
[
i
′
]
[
k
]
,
f
[
k
+
1
]
[
j
]
≥
f
[
k
+
1
]
[
j
′
]
f[i][k]≥f[i'][k],f[k+1][j]≥f[k+1][j']
f[i][k]≥f[i′][k],f[k+1][j]≥f[k+1][j′]
所以,
f
[
i
]
[
j
]
≥
f
[
i
′
]
[
j
′
]
f[i][j]≥f[i'][j']
f[i][j]≥f[i′][j′]
需要用到这个结论来进行后面的讨论。
求证:
f
[
a
]
[
c
]
+
f
[
b
]
[
d
]
≤
f
[
a
]
[
d
]
+
f
[
b
]
[
c
]
f[a][c]+f[b][d]≤f[a][d]+f[b][c]
f[a][c]+f[b][d]≤f[a][d]+f[b][c]
①当
a
=
b
a=b
a=b或
c
=
d
c=d
c=d,显然成立。
仍然使用归纳法。设当前区间
[
a
,
d
]
[a,d]
[a,d]内的所有子区间满足四边形不等式。
两种情况
①
a
<
b
=
c
<
d
a<b=c<d
a<b=c<d
②
a
<
b
<
c
<
d
a<b<c<d
a<b<c<d
对于第一种情况,
f
[
a
]
[
b
]
+
f
[
b
]
[
d
]
≤
f
[
a
]
[
d
]
+
f
[
b
]
[
b
]
=
f
[
a
]
[
d
]
f[a][b]+f[b][d]≤f[a][d]+f[b][b]=f[a][d]
f[a][b]+f[b][d]≤f[a][d]+f[b][b]=f[a][d]。设
k
=
s
[
a
]
[
d
]
k=s[a][d]
k=s[a][d],表示
f
[
a
]
[
d
]
f[a][d]
f[a][d]的最优决策点。
有3种情况。
k
<
b
,
k
=
b
,
k
>
b
k<b,k=b,k>b
k<b,k=b,k>b
①
k
<
b
k<b
k<b则
f
[
a
]
[
b
]
+
f
[
b
]
[
d
]
≤
f[a][b]+f[b][d]≤
f[a][b]+f[b][d]≤
f
[
a
]
[
k
]
+
f
[
k
+
1
]
[
b
]
+
w
(
a
,
b
)
+
f
[
b
]
[
d
]
≤
f[a][k]+f[k+1][b]+w(a,b)+f[b][d]≤
f[a][k]+f[k+1][b]+w(a,b)+f[b][d]≤ 拆项
f
[
a
]
[
k
]
+
f
[
k
+
1
]
[
d
]
+
w
(
a
,
d
)
≤
f
[
a
]
[
d
]
f[a][k]+f[k+1][d]+w(a,d)≤f[a][d]
f[a][k]+f[k+1][d]+w(a,d)≤f[a][d] 换字母,扩
②
k
=
b
k=b
k=b,显然。
③
k
>
b
k>b
k>b,情况和①类似。
a
<
b
<
c
<
d
a<b<c<d
a<b<c<d?
显然,函数
y
(
k
)
=
f
[
a
]
[
k
]
+
f
[
k
+
1
]
[
b
]
y(k)=f[a][k]+f[k+1][b]
y(k)=f[a][k]+f[k+1][b]有个最低点,当
k
=
s
[
a
]
[
b
]
k=s[a][b]
k=s[a][b]时。
所以,将
f
[
b
]
[
c
]
f[b][c]
f[b][c]的最优决策点
y
y
y和
f
[
a
]
[
d
]
f[a][d]
f[a][d]的最优决策点z找出来。
证明方法:有待展开的2个区间,
f
[
a
]
[
c
]
f[a][c]
f[a][c]和
f
[
b
]
[
d
]
f[b][d]
f[b][d]
仍然将区间
[
a
,
d
]
[a,d]
[a,d]分成区间
[
a
,
b
)
,
[
b
,
d
]
[a,b),[b,d]
[a,b),[b,d]。
①
a
<
b
≤
y
≤
z
a<b≤y≤z
a<b≤y≤z,y拆
f
[
a
]
[
c
]
f[a][c]
f[a][c],z拆
f
[
b
]
[
d
]
f[b][d]
f[b][d]
②
a
<
b
≤
z
≤
y
a<b≤z≤y
a<b≤z≤y,z拆
f
[
a
]
[
c
]
f[a][c]
f[a][c],y拆
f
[
b
]
[
d
]
f[b][d]
f[b][d]
③
a
<
b
≤
z
≤
y
a<b≤z≤y
a<b≤z≤y,z拆
f
[
a
]
[
c
]
f[a][c]
f[a][c],y拆
f
[
b
]
[
d
]
f[b][d]
f[b][d]
最后都可以证明四边形不等式成立。证明方法,参考第一种情况的证明方法。
证毕。
用途
定理2
f
[
i
]
[
j
]
=
m
i
n
f
[
i
]
[
k
]
,
f
[
k
+
1
]
[
j
]
+
w
(
i
,
j
)
f[i][j]=min{f[i][k],f[k+1][j]}+w(i,j)
f[i][j]=minf[i][k],f[k+1][j]+w(i,j)
优化前复杂度:
O
(
n
3
)
O(n^3)
O(n3)
优化后复杂度:
O
(
n
2
)
O(n^2)
O(n2)
若f满足四边形不等式,则s也同时满足
s
[
i
]
[
j
−
1
]
≤
s
[
i
]
[
j
]
≤
s
[
i
+
1
]
[
j
]
s[i][j-1]≤s[i][j]≤s[i+1][j]
s[i][j−1]≤s[i][j]≤s[i+1][j]
先证明
s
[
i
]
[
j
−
1
]
≤
s
[
i
]
[
j
]
s[i][j-1]≤s[i][j]
s[i][j−1]≤s[i][j]。一般这种证决策单调性,用反证法。
就是说证明
s
[
i
]
[
j
−
1
]
≤
s
[
i
]
[
j
]
s[i][j-1]≤s[i][j]
s[i][j−1]≤s[i][j]是错的。
令
k
1
=
s
[
i
]
[
j
]
,
k
2
=
s
[
i
]
[
j
−
1
]
k_1=s[i][j],k_2=s[i][j-1]
k1=s[i][j],k2=s[i][j−1]
通过不等式两边同时补某些加上这些项之后,整个式子待扩充的项,及合并,即可证明。
s [ i ] [ j ] ≤ s [ i + 1 ] [ j ] s[i][j]≤s[i+1][j] s[i][j]≤s[i+1][j]的证明方法也是如此。
判断
如果
∀
a
≤
b
≤
c
≤
d
\forall a\leq b\leq c\leq d
∀a≤b≤c≤d,满足
w
(
a
,
c
)
+
w
(
b
,
d
)
≤
w
(
a
,
d
)
+
w
(
b
,
c
)
w(a,c)+w(b,d)≤w(a,d)+w(b,c)
w(a,c)+w(b,d)≤w(a,d)+w(b,c)
当且仅当:
w
(
i
,
j
)
+
w
(
i
+
1
,
j
+
1
)
≤
w
(
i
,
j
+
1
)
+
w
(
i
+
1
,
j
)
w(i,j)+w(i+1,j+1)\leq w(i,j+1)+w(i+1,j)
w(i,j)+w(i+1,j+1)≤w(i,j+1)+w(i+1,j)
必要性显然。(有A必有B)
证明充分性。(有B必有A)
证明方法:整体法,换元,如将
i
+
1
i+1
i+1看成i。
w
(
i
,
j
)
+
w
(
i
+
1
,
j
+
1
)
≤
w
(
i
,
j
+
1
)
+
w
(
i
+
1
,
j
)
⇒
w(i,j)+w(i+1,j+1)≤w(i,j+1)+w(i+1,j)\Rightarrow
w(i,j)+w(i+1,j+1)≤w(i,j+1)+w(i+1,j)⇒
w
(
i
,
j
)
−
w
(
i
,
j
+
1
)
≤
w
(
i
+
1
,
j
)
−
w
(
i
+
1
,
j
+
1
)
≤
w
(
i
+
2
,
j
)
−
w
(
i
+
2
,
j
+
1
)
≤
.
.
.
≤
w
(
i
+
k
,
j
)
−
w
(
i
+
k
,
j
+
1
)
w(i,j)-w(i,j+1)≤w(i+1,j)-w(i+1,j+1)\leq w(i+2,j)-w(i+2,j+1) \leq... \leq w(i+k,j)-w(i+k,j+1)
w(i,j)−w(i,j+1)≤w(i+1,j)−w(i+1,j+1)≤w(i+2,j)−w(i+2,j+1)≤...≤w(i+k,j)−w(i+k,j+1)
同理,
i
<
i
+
k
≤
j
≤
j
+
l
i<i+k≤j≤j+l
i<i+k≤j≤j+l也用一样的蒸发。
具体应用
环形DP
这篇博客写得好!请点这里
给一道经典例题:
在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.
先不用四边形不等式优化,先将
O
(
n
3
)
O(n^3)
O(n3)的DP写出来。
显然设
d
p
[
l
]
[
r
]
dp[l][r]
dp[l][r]表示
[
l
,
r
]
[l,r]
[l,r]区间的答案。
O
(
n
3
)
O(n^3)
O(n3)转移显然。
如果是不是环,直接求
d
p
[
1
]
[
n
]
dp[1][n]
dp[1][n]即可。
加上环的限制?
显然,将
[
1
,
n
]
[1,n]
[1,n]复制一遍,然后求
m
i
n
d
p
[
l
]
[
l
+
l
e
n
−
1
]
min{dp[l][l+len-1]}
mindp[l][l+len−1]。
这道题目是HDU3506 Monkey Party。可以在HDU上提交。
用四边形不等式优化?
f
[
i
]
[
j
]
=
m
i
n
f
[
i
]
[
k
]
+
f
[
k
+
1
]
[
j
]
+
w
(
i
,
j
)
f[i][j]=min{f[i][k]+f[k+1][j]+w(i,j)}
f[i][j]=minf[i][k]+f[k+1][j]+w(i,j)
w
(
i
,
j
)
=
Σ
k
=
i
j
a
[
k
]
w(i,j)=\Sigma_{k=i}^j a[k]
w(i,j)=Σk=ija[k]
显然,
w
(
i
,
j
)
w(i,j)
w(i,j)满足区间包含单调性和四边形不等式,所以
f
[
i
]
[
j
]
f[i][j]
f[i][j]也满足区间包含单调性和四边形不等式。
所以,
s
[
i
]
[
j
−
1
]
≤
s
[
i
]
[
j
]
≤
s
[
i
+
1
]
[
j
]
s[i][j-1]≤s[i][j]≤s[i+1][j]
s[i][j−1]≤s[i][j]≤s[i+1][j]
区间DP,通常先枚举区间长度,再枚举左端点。
伪代码
for len=1 to n
for l=1 to n-len+1{
r=l+len-1;
for k=s[l][r-1] to s[l+1][r]
f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+w(l,r));
}
时间复杂度: O ( n 2 ) O(n^2) O(n2)
证明?
对于每个len,复杂度:
Σ
i
=
1
n
−
l
e
n
+
1
s
[
i
+
1
]
[
i
+
l
e
n
−
1
]
−
s
[
i
]
[
i
+
l
e
n
−
2
]
\Sigma_{i=1}^{n-len+1} s[i+1][i+len-1]-s[i][i+len-2]
Σi=1n−len+1s[i+1][i+len−1]−s[i][i+len−2]
消去很多项,最后剩下
s
[
n
−
l
e
n
+
2
]
[
n
]
−
s
[
1
]
[
l
−
1
]
s[n-len+2][n]-s[1][l-1]
s[n−len+2][n]−s[1][l−1],所以复杂度是
O
(
n
)
O(n)
O(n)的。
赛场上
只有那些大佬才能够推出这些东西暴虐我们。
我们该做什么?
打表。
找出
s
[
i
]
[
j
]
s[i][j]
s[i][j]。
判断
w
(
i
,
j
)
w(i,j)
w(i,j)是否满足区间包含单调性和四边形不等式。
找
f
(
i
,
j
)
f(i,j)
f(i,j)是否满足区间包含单调性和四边形不等式。
这些都可以暴力求。
对于w(i,j)的整体感知
这是个大难点。
通过
w
(
i
,
j
)
w(i,j)
w(i,j)来设
f
[
i
]
[
j
]
f[i][j]
f[i][j]。
w
(
i
,
j
)
w(i,j)
w(i,j)的意义:表示区间
[
i
,
j
]
[i,j]
[i,j]的贡献。
怎么样能够快速地求出
w
(
i
,
j
)
w(i,j)
w(i,j)?这个
w
(
i
,
j
w(i,j
w(i,j的复杂度不超过主DP的复杂度。一般一个式子搞定。
比如说能够通过
w
(
i
+
1
,
j
)
w(i+1,j)
w(i+1,j)顺利推出
w
(
i
,
j
)
w(i,j)
w(i,j),
w
(
i
,
j
−
1
)
w(i,j-1)
w(i,j−1)顺利推出
w
(
i
,
j
)
w(i,j)
w(i,j)。
例题
POJ1160 Post Office
有一个数轴n个点,第i个点的坐标为
p
i
p_i
pi
在n个点中选出k个作为关键点。问每个点到离其最近的关键点的距离和的最小值。
设
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示选了i个关键点,1~j号点已经确定了哪个关键点离它们最近。
d
p
[
i
]
[
j
]
=
m
i
n
{
d
p
[
i
]
[
k
]
+
w
(
k
+
1
,
j
)
}
dp[i][j]=min\{dp[i][k]+w(k+1,j)\}
dp[i][j]=min{dp[i][k]+w(k+1,j)}
这里的
w
(
i
,
j
)
w(i,j)
w(i,j)代表了i到j号点的花费。并且在i~j中只设立一个关键点!!!
解决了这个问题,那么如何通过
w
(
i
+
1
,
j
)
w(i+1,j)
w(i+1,j)顺利推出
w
(
i
,
j
)
w(i,j)
w(i,j),
w
(
i
,
j
−
1
)
w(i,j-1)
w(i,j−1)顺利推出
w
(
i
,
j
)
w(i,j)
w(i,j)?
经过递推发现,
所以,
w
(
i
,
j
)
=
w
(
i
,
j
−
1
)
+
p
[
j
]
−
p
[
i
+
j
2
]
w(i,j)=w(i,j-1)+p[j]-p[\frac{i+j}{2}]
w(i,j)=w(i,j−1)+p[j]−p[2i+j]
w
(
i
,
j
)
=
w
(
i
+
1
,
j
)
+
p
[
i
+
j
2
]
−
p
[
i
]
w(i,j)=w(i+1,j)+p[\frac{i+j}{2}]-p[i]
w(i,j)=w(i+1,j)+p[2i+j]−p[i]
然后证明
w
w
w满足四边形不等式。
谁会去证啊?只有大佬们才去。我太弱了。
最后说的
四边形不等式通过决策单调性来优化复杂度的。
那些证明的方法,受到了文化课的启发。