考虑状态转移方程: $$ f(i)=\min_{j \le i} \{g(j)+w(i,j)\} $$ 其中最小值可能改为最大值;$j \le i$可能改为$j<i$或$j \not = i$(先考虑$j<i$,再倒序处理)。 设 $$ p(i)=\arg \min_{j \le i} \{g(j)+w(i,j)\} $$ 若满足$p(i)$(非严格)单调递增,则可使用决策单调性优化。 对于每个$j$,$p(i)=j$的解要么没有,要么在某个连续的区间上。用一个三元组$(j,l,r)$表示 $$ \forall i \in [l,r] \; p(i)=j $$ 维护一个由上述三元组构成的单调队列。 当遍历所有$i$时,
- 更新队首区间范围。若$i$已经超过当前队首所表示的区间,则队首不再有用,故弹出队首。否则,将当前队首的$l$变为$i$。
- 清除无用队尾。若$i$对队尾区间内的所有值均比当前队尾所取参数更优,则弹出队尾。注意,这里我们把$i$看成是一个$j$,和当前队尾所取的$j’$比较当当前队尾区间开头作为$i’$时,$j$和$j’$谁更优。注意此时有以下三种可能情形:
- 单调队列被清空了;
- 单调队列被删除了一些元素,但没被删光;
- 单调队列未被删除任何元素。
- 讨论:
- 对于上述第一种情况,这表明$i$打败了所有的当前方案,我们更新在区间$[i , n]$上的最优解为$i$。
- 对于第二和第三种情况,我们认为在队尾可能存在$i$作为最优解更新的区间,因此对队尾的区间进行二分搜索,寻找最小的$i’$,使对它而言,$i$作为$j$比当前队尾所取的$j’$更优。但这个$i’$有可能不存在,即对整个队尾的区间而言,队尾的所取的$j$确实已经比$i$更优,因此搜索的初始值设置为队尾的$r+1$。除了发生第三种情况且同时$i’$不存在(即停留在初始值$n+1$),我们不需要更新队列外,我们更新在区间$[i’,n]$上的最优解为$i$。
对于决策单调性的证明,严格做法是四边形不等式,但竞赛中也可通过猜想结合打表来处理。 注意:决策单调性的成立命题不等价于对于每个$i$,$g(j) + w(i, j)$具有单调性。这意味着,虽然$p(i) \ge p(i-1)$,但我们不能使用尝试自增$j$的方式为每个$i$进行决策选择。例如,当$p(2)=0$、$p(3)=3$时,可能对于$i=3$而言,$j=1,2$相比于$j=0$并不是更优的决策,因此尝试自增$j$会使得$j$停住不动,无法正确转移到最优解$j=3$。 例题:Lightning Conductor
1 |
|