Loading

[笔记]浅谈四边形不等式

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)\)

考虑一个式子

\[(f(i+1,j,k)-f(i+1,j,d))-(f(i,j,k)-f(i,j,d)). \]

变形得 :

\[\begin{equation}\begin{split} &=(f(i+1,j,k)+f(i,j,d))-(f(i+1,j,d)+f(i,j,k))\\ &=(f(i+1,k)+f(k,j)+f(i,d)+f(d,j))-\\ &\quad (f(i+1,d)+f(d,j)+f(i,k)+f(k,j))\\ & =(f(i+1,k)+f(i,d))-(f(i+1,d)+f(i,k))\\ \end{split}\end{equation} \]

显然 \(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)\) 。由此可得:

\[f(i+1,j,k)\ge f(i+1,j,d) \]

我们再设 \(p=s(i+1,j)\) ,那么显而易见:

\[f(i+1,j,k)\ge f(i+1,j,d)\ge f(i+1,j,p) \]

所以说明了什么?说明了 \(k\) 永远不可能等于 \(p\)。也就是说 \(d\le b\)。也就得到了 \(s(i,j) \le s(i+1,j)\)。对于 \(s(i,j-1) \le s(i,j)\) 也是差不多的方法证明。

posted @ 2022-03-23 19:31  小铭同学lym  阅读(68)  评论(0)    收藏  举报