动态规划(DP)——单调优化

形式

形如

d p [ i ] = m a x ( d p [ j ] + g [ j ] ) + w [ i ]     | ( j f [ i ] )

的dp方程,
(f[x],g[x],w[x]分别为与x有关的不同式子)
(需保证f[x]满足单调性)

思路

如果 j > k ,且 d p [ j ] + g [ j ] > d p [ k ] + g [ k ] ,那么 d p [ j ] 一定优于 d p [ k ]

单调队列

维护单调队列使 d p [ x ] + g [ x ] 递减(队头优于队尾),优先选择队头元素,当队头元素超出范围后弹出。

实现

对于一个新的 i ,如果 d p [ i ] + g [ i ] 大于队尾, i 一定更优,所以需要不停的将队尾不优的元素弹出tail--,直到队尾大于 d p [ i ] + g [ i ] ,保证了队列的单调性。
然后计算 f [ i ] ,把队头超出范围的元素弹出head++。 队头元素即为最优取值。