“满足四边形不等式”是“满足决策单调性”的充分不必要条件,满足决策单调性的题目不一定可以使用这篇文章提到的优化方式。

解决的问题

对于转移方程为类似于下面情况的且 n2×105n\le 2\times 10^5,那么可以考虑用四边形不等式优化。

fi=minj=0i{V(j,i)}f_{i}=\min\limits_{j=0}^i\{V(j,i)\}

具体的 V(j,i)V(j,i) 需要满足一些性质并且可以 O(1)O(1) 求解。

考虑怎么最后 fif_i 实际上取到的 jj 就是 fif_i 的决策点,我们记其为 pip_i

四边形不等式

定义

如果 a,b,c,d[1,n]Z+a<bc<d\forall a,b,c,d\in[1,n]\cap \mathbb{Z}^+\wedge a\lt b\le c\lt d 满足 V(a,d)+V(b,c)V(a,c)+V(b,d)V(a,d)+V(b,c)\ge V(a,c)+V(b,d),那么我们称 VV 满足四边形不等式。

这个结论看起来不好记,实际上也很难懂,可以简记为包含关系大于相交关系

推论

如果 a,c[1,n]Z+a<c\forall a,c\in[1,n]\cap\mathbb{Z}^+\wedge a\lt c 满足 V(a,c+1)+V(a+1,c)V(a,c)+V(a+1,c+1)V(a,c+1)+V(a+1,c)\ge V(a,c)+V(a+1,c+1),那么也可以推出 VV 满足四边形不等式。

证明

aa+1a'\gets a+1 得到:

V(a+1,c+1)+V(a+2,c)V(a+1,c)+V(a+2,c+1)V(a+1,c+1)+V(a+2,c)\ge V(a+1,c)+V(a+2,c+1)

把两式相加整理得到:

V(a,c+1)+V(a+2,c)V(a,c)+V(a+2,c+1)V(a,c+1)+V(a+2,c)\ge V(a,c)+V(a+2,c+1)

考虑一直重复上面的操作就可以把 b=a+1b=a+1 一直推广到 b=+b=+\infty

考虑通过类似的方法拓展 cc,容易理解。

应用

四边形不等式的证明及其的麻烦,考试的是否可以直接通过暴力枚举 a,ca,c 来确定是否满足四边形不等式。

直接枚举 22 个元素比去枚举 44 个元素要优秀许多。

决策单调性

定义

如果 i,j[1,n]Z+ij\forall i,j\in[1,n]\cap\mathbb{Z}^+\wedge i\le j 满足 pipjp_i\le p_j,那么我们称这个转移方程具有决策单调性。

定理

如果 VV 满足四边形不等式,那么这个转移方程满足决策单调性。

证明

i,j[1,n]Z+iji,j\in[1,n]\cap\mathbb{Z}^+\wedge i\le j,如果 pi>pjp_i\gt p_j 那么就有:

fi=V(pi,i),fj=V(pj,j)f_i=V(p_i,i),f_{j}=V(p_j,j)

根据定义有:

V(pi,i)+V(pj,j)V(pi,j)+V(pj,i)V(p_i,i)+V(p_j,j)\ge V(p_i,j)+V(p_j,i)

所以至少有一个 ff 是优于本来的,欲假设矛盾,因而得证。

决策单调性优化 DP

分治

如果 V(j,i)V(j,i) 的计算与 fjf_j 无关,那么可以考虑使用分治算法解决。

这样的转移方程很少,一般都是题目要求求出 11nn 之内所有的答案。

考虑设计函数 solve(l,r,x,y)\text{solve}(l,r,x,y) 表示求解 [l,r][l,r]ff 的值,而且其决策都是再 [x,y][x,y] 中的。

计算 fmidf_{mid} 的值,假设其决策点再 PP,那么显然对于 [l,mid)[l,mid)ff 的决策点都在 [x,P][x,P],而对于 (mid,r](mid,r] 的决策点则是在 [P,y][P,y] 里。

一直递归直到 l=rl=r,时间复杂度为 O(nlogn)O(n\log n)

单调栈与队列

先假设所有的决策点都是 00,那么从前向后计算,尝试将在计算出 fif_i 之后将 ii 作为决策点。

因为其具有决策单调性,所以按照上面的方式进行更新,如果 fif_i 可以更新到 fxf_x,那么从 fxf_xfnf_n 都是可以被 fif_i 更新的。

发现这个东西具有单调性,那么考虑去二分第一个满足用 fif_i 更新更有的节点。

在二分出第一个位置假设是 pp,那么考虑把 [p,n][p,n] 合并为一个区间,表示这个区间的决策点都是 ii

时间复杂度是 O(nlogn)O(n\log n)log\log 是二分。

因为一次操作最多只会新增一个区间,所以总共清除的区间数最大只有 nn,就是 O(n)O(n) 的。