“满足四边形不等式”是“满足决策单调性”的充分不必要条件,满足决策单调性的题目不一定可以使用这篇文章提到的优化方式。
解决的问题
对于转移方程为类似于下面情况的且 n≤2×105,那么可以考虑用四边形不等式优化。
fi=j=0mini{V(j,i)}
具体的 V(j,i) 需要满足一些性质并且可以 O(1) 求解。
考虑怎么最后 fi 实际上取到的 j 就是 fi 的决策点,我们记其为 pi。
四边形不等式
定义
如果 ∀a,b,c,d∈[1,n]∩Z+∧a<b≤c<d 满足 V(a,d)+V(b,c)≥V(a,c)+V(b,d),那么我们称 V 满足四边形不等式。
这个结论看起来不好记,实际上也很难懂,可以简记为包含关系大于相交关系。
推论
如果 ∀a,c∈[1,n]∩Z+∧a<c 满足 V(a,c+1)+V(a+1,c)≥V(a,c)+V(a+1,c+1),那么也可以推出 V 满足四边形不等式。
证明
令 a′←a+1 得到:
V(a+1,c+1)+V(a+2,c)≥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)
考虑一直重复上面的操作就可以把 b=a+1 一直推广到 b=+∞。
考虑通过类似的方法拓展 c,容易理解。
应用
四边形不等式的证明及其的麻烦,考试的是否可以直接通过暴力枚举 a,c 来确定是否满足四边形不等式。
直接枚举 2 个元素比去枚举 4 个元素要优秀许多。
决策单调性
定义
如果 ∀i,j∈[1,n]∩Z+∧i≤j 满足 pi≤pj,那么我们称这个转移方程具有决策单调性。
定理
如果 V 满足四边形不等式,那么这个转移方程满足决策单调性。
证明
设 i,j∈[1,n]∩Z+∧i≤j,如果 pi>pj 那么就有:
fi=V(pi,i),fj=V(pj,j)
根据定义有:
V(pi,i)+V(pj,j)≥V(pi,j)+V(pj,i)
所以至少有一个 f 是优于本来的,欲假设矛盾,因而得证。
决策单调性优化 DP
分治
如果 V(j,i) 的计算与 fj 无关,那么可以考虑使用分治算法解决。
这样的转移方程很少,一般都是题目要求求出 1 到 n 之内所有的答案。
考虑设计函数 solve(l,r,x,y) 表示求解 [l,r] 的 f 的值,而且其决策都是再 [x,y] 中的。
计算 fmid 的值,假设其决策点再 P,那么显然对于 [l,mid) 的 f 的决策点都在 [x,P],而对于 (mid,r] 的决策点则是在 [P,y] 里。
一直递归直到 l=r,时间复杂度为 O(nlogn)。
单调栈与队列
先假设所有的决策点都是 0,那么从前向后计算,尝试将在计算出 fi 之后将 i 作为决策点。
因为其具有决策单调性,所以按照上面的方式进行更新,如果 fi 可以更新到 fx,那么从 fx 到 fn 都是可以被 fi 更新的。
发现这个东西具有单调性,那么考虑去二分第一个满足用 fi 更新更有的节点。
在二分出第一个位置假设是 p,那么考虑把 [p,n] 合并为一个区间,表示这个区间的决策点都是 i。
时间复杂度是 O(nlogn),log 是二分。
因为一次操作最多只会新增一个区间,所以总共清除的区间数最大只有 n,就是 O(n) 的。