显然这个条件等价于,对于所有 a\le b 的 a,b,w(a,b+1)-w(a,b)\ge w(a+1,b+1)-w(a+1,b),因为差分具有可加性、不等号具有传递性。此式也等价于 w 的二阶差分 \le0。
第一类 dp
f_i=\min_{j<i}\{f_j+w(j,i)\}
决策单调性及其证明
若 w 满足四边形不等式,则 f_i 的决策点 j 具有单调性。这里的单调性显然只有 j 随着 i 的增大而增大有意义,所以下文都不显式说明。
证明:考虑一个位置 i,它的最优决策是 j,这说明对于任意 k<j,f_j+w(j,i)\le f_k+w(k,i)。对于任意 i'>i,考虑证明 j 这个决策仍比 k 优。因为大区间差分大于等于小区间差分,而这里的 k 对应的是大区间,即 w(j,i')-w(j,i)\le w(k,i')-w(k,i)。将两个不等式相加,得 f_j+w(j,i')\le f_k+w(k,i'),这说明 j 成为最优决策后,k 永远不可能再成为最优决策。得证。
算法一:二分队列
该算法要求 w 满足四边形不等式。
按顺序枚举 i,求出 f_i 后,考虑 i 能成为后面哪些位置的决策点。根据上面关于决策单调性的证明,在 i 之后一定存在一个点 j,满足 j 之前 i 作为决策比 i 之前的决策都不优,j 之后 i 作为决策比 i 之前的决策都优。仅有 f 决策单调不足以推出这个结论,还需要 w 满足四边形不等式(或其他性质)。此时不妨暂时把 j 之后的决策都设为 i,之后遇到更优的再改。
具体地,维护一个队列,队列中每个位置是一个三元组 (l,r,k),表示 [l,r] 内目前的最优决策点是 k。按顺序枚举每一个 i。求出 f_i 后,先尝试弹出队尾:若队尾是 (l,r,k),则检查 l 处决策 i 是否比 k 优,如果优则弹出。直到无法弹出,此时在 [l,r] 中二分出最小的 j,满足 j 处 i 比 k 优。将队尾修改为 (l,j-1,k),并再将 (j,n,i) 插入队尾。及时弹出队头,即可在枚举到 i 时快速找出最优决策。
算法二:Simplified LARSCH Algorithm by noshi91
该算法要求 w 满足四边形不等式,可以在 w 不支持随机访问只支持移动访问的情况下做到 \mathcal O(n\log n)。
该算法要求 w 满足四边形不等式,可以在 w 支持随机访问的情况下做到 \mathcal O(n)。
笔者也不会,读者可自行阅读:
Larmore, L. L., & Schieber, B. (1991). On-line dynamic programming with applications to the prediction of RNA secondary structure. Journal of Algorithms, 12(3), 490-515.
注:此方程无法使用第三类 dp 中的分治算法,因为只有求出 i 之前的所有 dp 值后,f_i 的决策点和值才能被确定。
记 p_{l,r} 为 f_{l,r} 的最优决策点,我们需要的决策单调性是 l 固定时,p_{l,r} 随 r 的增大而增大,且 r 固定时,p_{l,r} 随 l 的增大而增大。观察到,l 固定时,这个式子和上面一维的很像,只是 \min 中的 w(j,i) 变成了 f_{i+1,r}。如果 f 也满足四边形不等式,那么通过一样的过程可以证明决策单调性。r 固定时同理,读者可尝试自行推导。
有定理:若 w 满足四边形不等式,且对于所有 a\le b\le c\le d 的 a,b,c,d 有 w(b,c)\le w(a,d)(称为“区间包含单调性”),那么 f 满足四边形不等式。
证明:
从差分的角度不好考虑,所以采用这个形式:
f_{a,d}+f_{b,c}\ge f_{a,c}+f_{b,d}
首先,这四个形如 f_{l,r} 的东西里都有一个 w(l,r),而 w 满足四边形不等式,所以可以将它全部去掉,只剩下四个 \min。