盒子
盒子
文章目录
  1. 四边形不等式
    1. Part I
    2. Part II
      1. 基础
      2. 归纳(Formal Verification)
    3. Part III
      1. 左侧
      2. 右侧
    4. Part IV
    5. Part V
  2. 石子合并
  3. [IOI2000]邮局
  4. E. Ciel and Gondolas
  5. Division
  6. Chef and Bitwise OR Operation
  7. 题单

四边形不等式优化dp

四边形不等式

石子合并!

$f[i,j]=\max _ {i \le k < j} { f[i,k]+f[k+1,j]+w[i,j] }$

最优决策点?每一行单调并且每一列单调!

$p[i,j-1] \le p[i,j] \le p[i+1,j]$

四边形不等式:

$w[a,c]+w[b,d] \le w[a,d]+w[b,c] (a \le b \le c \le d)$

实际上是:

$w[b,d]-w[b,c] \le w[a,d]-w[a,c]$

区间包含关系单调?

$w[a,d] \ge w[b,c] (a \le b \le c \le d)$


有以下结论:

  • 若 $w$ 满足四边形不等式,且区间包含关系单调,则 $f$ 也满足四边形不等式
  • 若 $f$ 满足四边形不等式,则 $p[i,j-1] \le p[i][j] \le p[i+1][j]$
    • $p$ 的每一行单调增且每一列单调增
    • 由于填充满 $p$ 只需要 $O(n^2)$ 的时间,所以计算 $f$ 过程中的枚举总时间复杂度是 $O(n^2)$
  • 若 $w$ 满足四边形不等式,当且仅当 $w[i,j] + w[i+1,j+1] \le w[i+1,j]+w[i,j+1]$

Part I

当 $w[i,j]+w[i+1,j+1] \le w[i+1,j]+w[i,j+1]$ 时,

即 $w[i,j]-w[i+1,j] \le w[i,j+1]-w[i+1,j+1]$

即 $(w_i-w_{i+1})(j) \le (w_i-w_{i+1})(j+1)$

所以 $w$ 相邻行差分后是单调的

所以 $\forall c \le d$,有 $(w_{i}-w_{i+1})(c) \le (w_{i}-w_{i+1})(d)$

同理,$\forall a \le b$,从 $(w_{a}-w_{a+1})$ 开始不断累加,得到 $(w_a-w_{b})$

于是有 $(w_{a}-w_{b})(c) \le (w_a-w_{b})(d)$

即 $w[a,c]+w[b,d] \le w[b,c]+w[a,d]$


Part II

之后证明 $f[i,j]+f[i+1,j+1] \le f[i,j+1]+f[i+1,j]$

按照区间长度进行归纳

基础

$$
\begin{aligned}
f[i,i]+f[i+1,i+1]
=&0 \\
\le & f[i,i+1] \\
\le & f[i,i+1]+f[i+1,i]
\end{aligned}
$$


归纳(Formal Verification)

一方面:

$$
\begin{aligned}
&f[i,j]=f[i,x]+f[x+1,j]+w[i,j] \\
&f[i+1,j+1]=f[i+1,y]+f[y+1,j+1]+w[i+1,j+1] \\
&f[i,j]+f[i+1,j+1] \le
f[i,x]+f[x+1,j] \\
&\quad +f[i+1,y]+f[y+1,j+1]
+w[i,j+1]+w[i+1,j]
\end{aligned}
$$

另一方面:

$$
\begin{aligned}
&f[i,j+1] \ge f[i,x]+f[x+1,j+1]+w[i,j+1] \\
&f[i+1,j] \ge f[i+1,y]+f[y+1,j]+w[i+1,j] \\
&f[i,j+1]+f[i+1,j] \ge f[i,x]+f[x+1,j+1]+ \\
&\quad w[i,j+1]+f[i+1,y]+f[y+1,j]+w[i+1,j]
\end{aligned}
$$

只需要证明(由归纳证明得证):

$$
f[x+1,j+1]+f[y+1,j] \ge f[x+1,j]+f[y+1,j+1]
$$


Part III

之后证明:$p[i,j-1] \le p[i,j] \le p[i+1,j]$

记 $L=p[i,j-1],M=p[i,j],R=p[i+1,j]$

考虑反证法,只需要分别证明 $p[i,j] < p[i,j-1],p[i+1,j] < p[i,j]$ 都不成立即可

左侧

假设 $p[i,j] < p[i,j-1]$,即 $M < L$

$$
\begin{aligned}
&\begin{cases}
f[M+1,j-1]+f[L+1,j] \le f[M+1,j]+f[L+1,j-1] \\
f[i,M]+f[M+1,j] \le f[i,L]+f[L+1,j]
\end{cases} \\
&\Rightarrow f[i,M]+f[M+1,j-1] \le f[i,L]+f[L+1,j-1]
\end{aligned}
$$

这与 $L=p[i,j-1]$ 矛盾(即 $f[i,L]+f[L+1,j-1] \le f[i,M]+f[M+1,j-1]$)


右侧

假设 $p[i,j]>p[i+1,j]$,即 $M>R$

$$
\begin{aligned}
&\begin{cases}
f[i,R]+f[i+1,M] \le f[i,M]+f[M+1,j] \\
f[i,M]+f[M+1,j] \le f[i,R]+f[R+1,j]
\end{cases} \\
& \Rightarrow f[i+1,M]+f[M+1,j] \le f[i+1,R]+f[M+1,j]
\end{aligned}
$$

这与 $R=p[i+1,j]$ 矛盾(即 $f[i+1,R]+f[R+1,j] \le f[i+1,M]+f[M+1,j]$)


Part IV

前面已经证完了可行决策区间,下面证明总枚举次数是 $O(n^2)$ 的

首先 $p[i,i]=i$,于是有(每行每列单调增):

$$
\sum_{i < j} p[i+1,j]-p[i,j-1] \le \sum_{i=1}^{n} n=n^2
$$

于是枚举次数是 $O(n^2)$ 的


Part V

若 $w$ 满足四边形不等式,那么哪些 $f$ 也会满足四边形不等式呐?

  • $f[i,j]=\min_{i \le k < j} { f[i,k]+f[k+1,j]+w[i,j] }$
  • $f[i,j]=\min_{k < j}{ f[i-1,k]+w[k+1,j] }$
    • 实际上此时dp是凸的,可以wqs二分
  • $f[i]=\min_{j < i}{ f[j]+w[j+1,i] }$
  • 当你发现区间dp的时间复杂度跑不过去但是打表后发现转移位置单调时

石子合并

有 $n(\le 300)$ 堆石子排成一排,现在要求把它们合并成一堆石子,但每次只能合并相邻两堆石子

合并一次的代价是相邻两堆石子的个数之和,现在需要求出把 $n$ 堆石子合并到一起的最小代价

如果 $n \le 5000$ 呐?


$$
\begin{cases}
f[i,j]=\min _ {i \le k < j} { f[i,k]+f[k+1,j]+w[i,j] } \\
w[i,j]=s[i]-s[j-1]
\end{cases}
$$

只需要证 $(w_i-w_{i+1})(j) \le (w_i-w_{i+1})(j+1)$

$$
\begin{aligned}
&LHS=(s[j]-s[i-1])-(s[j]-s[i])=s[i]-s[i-1] \\
&RHS=(s[j+1]-s[i-1])-(s[j+1]-s[i])=s[i]-s[i-1] \\
& \Rightarrow LHS \le RHS
\end{aligned}
$$

可以四边形不等式优化!


[IOI2000]邮局

高速公路旁边有一些村庄。高速公路表示为整数轴,每个村庄的位置用单个整数坐标标识。没有两个在同样地方的村庄。两个位置之间的距离是其整数坐标差的绝对值。

邮局将建在一些,但不一定是所有的村庄中。为了建立邮局,应选择他们建造的位置,使每个村庄与其最近的邮局之间的距离总和最小。

你要编写一个程序,已知村庄的位置和邮局的数量,计算每个村庄和最近的邮局之间所有距离的最小可能的总和。

  • 村庄数量为 $V(V \le 3000)$
  • 邮局数量为 $P(1 \le P \le 300,P \le V)$
  • 村庄位置为 $x_i(1 \le x_i \le 10000)$

设 $f[i,j]$ 表示前 $i$ 个城市里放了 $j$ 个邮局的最小代价

$$
\begin{cases}
f[i,j]=\min_{k < i}{ f[k,j-1]+w[k+1,i] } \\
w[i,j] = w [i,j-1]+x[j]-x\left[\lfloor \frac{i+j}{2} \rfloor\right]
\end{cases}
$$

四边形不等式:$w[i,j]+w[i+1,j+1] \le w[i+1,j]+w[i,j+1]$

$$
\begin{aligned}
&\begin{cases}
w[i,j+1]=w[i,j]+x[j+1]-x[(i+j)/2] \\
w[i+1,j+1]=w[i+1,j]+x[j+1]-x[(i+j+2)/2]
\end{cases} \\
\Rightarrow
&w[i+1,j]+w[i,j+1]-w[i,j]-w[i+1,j+1] \\
=&x[j+1]-x[(i+j)/2]-x[j+1]+x[(i+j+2)/2] \\
=&x[(i+j+2)/2]-x[(i+j)/2] \ge 0
\end{aligned}
$$


E. Ciel and Gondolas

  • 给定一个长度为 $n$ 的序列,现在你需要将这个序列划分成连续的 $k$ 段
  • 被划分到同一段的两个位置 $i,j$,会产生代价 $a_{ij}$,不同段不会产生代价
  • 现在请求出最小的贡献
  • $1 \le n \le 4000, 1 \le k \le \min(n, 800), 0 \le u_{ij} \le 9$

$f [ i , j ]$ 前 $i$ 个人用了 $j$ 艘船

$$
\begin{cases}
f [ i , j ] = \min _ {k < i} { f[ k,j - 1 ] + w[k + 1, i] } \\
w[i,j]=(\sum _ {x=i}^{j}\sum _ {y = i}^{j} u[x,y]) \cdot \frac{1}{2}
\end{cases}
$$

四边形不等式:$w[i,j]+w[i+1,j+1] \le w[i+1,j]+w[i,j+1]$

$$
\begin{aligned}
&w[i+1,j]+w[i,j+1]-w[i,j]-w[i+1,j+1] \\
=&\frac{1}{2} (
-\sum_{x=i}^{j}u[x,i]-\sum _ {y=i}^{j}u[i,y]+u[i,i] \\
& + \sum_{x=i}^{j+1}u[x,i]+\sum _ {y=i}^{j+1}u[i,y]-u[i,i]
) \\
=&\frac{1}{2} \left( u[j+1,i]+u[i,j+1] \right) \ge 0
\end{aligned}
$$


Division

  • 给定 $n$ 个数字,将它们划分成 $k$ 个集合,每个集合 $S$ 的代价是 $(\max S-\min S)^2$
  • 求最小的总代价和
  • $n \le 10000, k \le 5000$

先升序排序,然后有:

$$
\begin{cases}
f[i,j]=\min_{k < i} { f[k, j - 1] + w[k+1,i] } \\
w[i,j]=(a[j]-a[i])^2
\end{cases}
$$

四边形不等式:$w[i,j]+w[i+1,j+1] \le w[i+1,j]+w[i,j+1]$

$$
\begin{aligned}
&w[i+1,j]+w[i,j+1]-w[i,j]-w[i+1,j+1] \\
=&(a[j]-a[i+1])^2+(a[j+1]-a[i])^2 \\
&-(a[j]-a[i])^2-(a[j+1]-a[i+1])^2 \\
=&(2a[j]-a[i+1]-a[i])(a[i]-a[i+1]) \\
&+(2a[j+1]-a[i]-a[i+1])(a[i+1]-a[i]) \\
=&(a[i+1]-a[i])(2a[j+1]-2a[j]) \ge 0
\end{aligned}
$$


另一个角度:

$$
\begin{aligned}
f[i,j]
=&\min_{k < i} { f[k, j - 1] + (a[i]-a[k+1])^2 } \\
=&\min_{k < i} { (f[k,j-1]+a[k+1]^2)-2a[i]a[k+1] } + a[i]^2
\end{aligned}
$$

也可以斜率优化


Chef and Bitwise OR Operation

  • 给定一个长度为 $n$ 的序列,现在你需要将这个序列划分成连续的 $k$ 段
  • 每一段的贡献是这一段所有数的按位或
  • 现在请求出最大的贡献
  • $1 \le n \le 5000, 1 \le k \le n, 0 \le a_i \le 2^{30}$

$$
\begin{cases}
f[i,j]=\max _ {k < i} { f[k,j-1]+w[k+1,i] } \\
w[i,j]=\mathrm{BITOR}_{k=i}^{j}a[k]
\end{cases}
$$

四边形不等式:$w[i,j]+w[i+1,j+1] \le w[i+1,j]+w[i,j+1]$

$$
\begin{aligned}
&w[i+1,j]+w[i,j+1]-w[i,j]-w[i+1,j+1] \\
=&w[i+1,j]+a[i] \oplus w[i+1,j]\oplus a[j+1]-a[i] \\
& \oplus w[i+1,j]-w[i+1,j]\oplus a[j+1] \\
=&M+L\oplus M \oplus R-L \oplus M -M \oplus R \\
=&M+L\oplus R \oplus M-L\oplus M-R\oplus M
\end{aligned}
$$


只需要考虑每一位

  • 若 $L=R=0$,则 $M+M-M-M=0$
  • 若 $L=R=1$,则 $M+1-1-1=M-1$
    • 寄!!!
  • 若 $L=1,R=0$,则 $M+1-1-M=0$

换而言之,看这组数据:

1
1 0 0 1

$w[1,3]+w[2,4]=2 > 1=w[2,3]+w[1,4]$

很遗憾,$w$ 不满足四边形不等式,那怎么做?

但,真的不满足吗?


另一个角度:

$$
\begin{cases}
f[i,j]=\min _ {k < i} { f[k,j-1]+w[k+1,i] } \\
w[i,j]=-\mathrm{BITOR} _ {k=i}^{j}a[k]
\end{cases}
$$

$$
\begin{aligned}
&w[i+1,j]+w[i,j+1]-w[i,j]-w[i+1,j+1] \\
=&-M-L\oplus R \oplus M+L\oplus M+R\oplus M
\end{aligned}
$$


考虑每一位

  • 若 $L=R=0$,则 $-M-M+M+M=0$
  • 若 $L=R=1$,则 $-M-1+1+1=1-M \ge 0$
    • 这回没问题了
  • 若 $L=1,R=0$,则 $-M-1+1+M=0$

哪里出了问题?

  • $f=\max \cdots$
  • $f=\min \cdots$

之前用了两个式子:

$$
\begin{aligned}
&f[i,M]+f[M+1,j] \le f[i,L]+f[L+1,j] \\
&f[i,M]+f[M+1,j] \le f[i,R]+f[R+1,j]
\end{aligned}
$$

这里默认了 $f=\min \cdots$,于是引发了上面的问题

解决方案:让 $w$ 变成 $-w$,这样就可以把 $\max$ 翻转成 $\min$


上面的算法是 $O(n^2+nk)$ 的,如果 $k$ 比较小呢?


题单

支持一下
扫一扫,支持nekko
  • 微信扫一扫