[笔记]浅谈四边形不等式
0 前言
四边形不等式是用来优化区间dp的,它可以让 \(O(n^3) \to O(n^2)\)。所以考虑一道区间dp的题是否要用四边形不等式优化,看 n 的范围。
1 四边形不等式怎么用?
当 \(a \le b \le c \le d\) 时,满足 \(f(a,c)+f(b,d) \le f(a,d)+f(b,c)\) 时,四边形不等式可以使用。这是四边形不等式的条件。
其实,对于朴素的区间dp的做法写法如下:
for(int len=1;len<=n;++len)
{
for(int i=1;i<=n;++i)
{
if(i+len-1>n)
continue;
int j=i+len-1;
for(int k=i;k<=j;++k)
f[i][j]=min(f[i][k],f[k+1][j])+w[i][j]
}
}
对于 i,k 我们肯定是无法优化的。所以我们来优化 k。这时引进来一个数组 s[i][j] 代表 \(i\to j\) 的最佳切点。换而言之 f[i][s[i][j]]+f[s[i][j]+1][j]+w[i][j] 是最小的。
然后整个代码就可以换成:
for(int len=1;len<=n;++len)
{
for(int i=1;i<=n;++i)
{
if(i+len-1>n)
continue;
int j=i+len-1;
for(int k=s[i][j-1];k<=s[i+1][j];++k)
f[i][j]=min(f[i][k],f[k+1][j])+w[i][j]
}
}
2 证明?
假设满足四边形不等式的条件并且我们可以知道 \(s(i,j-1) \le s(i,j) \le s(i+1,j)\) (由上面代码得)。关键是如何证明\(s(i,j-1) \le s(i,j) \le s(i+1,j)\) ?
设 \(d=s(i,j),i+1 \le k <d\) ,\(f(i,j,l)\) 表示dp状态 \(i \to j\) 以 \(l\) 为切点的值。
显而易见,k 不是最优的切点。所以 \(f(i,j,d) \le f(i,j,k)\)。
考虑一个式子
变形得 :
显然 \(i\le i+1 < k \le d\) ,所以 \(f(i,k)+f(i+1,d) \le f(i,d)+f(i+1,k)\) 带入式子。
所以 \((f(i+1,k)+f(i,d))-(f(i+1,d)+f(i,k)) \ge 0\),
所以 \((f(i+1,j,k)-f(i+1,j,d))-(f(i,j,k)-f(i,j,d)) \ge 0\) 又因为 \(f(i,j,d) \le f(i,j,k)\) ,所以 \(f(i,j,k)-f(i,j,d) \ge 0\) ,所以 \(f(i+1,j,k)-f(i+1,j,d)\) 。由此可得:
我们再设 \(p=s(i+1,j)\) ,那么显而易见:
所以说明了什么?说明了 \(k\) 永远不可能等于 \(p\)。也就是说 \(d\le b\)。也就得到了 \(s(i,j) \le s(i+1,j)\)。对于 \(s(i,j-1) \le s(i,j)\) 也是差不多的方法证明。

浙公网安备 33010602011771号