形式
形如
的dp方程,
(f[x],g[x],w[x]分别为与x有关的不同式子)
(需保证f[x]满足单调性)
思路
如果 j>k j > k ,且 dp[j]+g[j]>dp[k]+g[k] d p [ j ] + g [ j ] > d p [ k ] + g [ k ] ,那么 dp[j] d p [ j ] 一定优于 dp[k] d p [ k ]
维护单调队列使 dp[x]+g[x] d p [ x ] + g [ x ] 递减(队头优于队尾),优先选择队头元素,当队头元素超出范围后弹出。
实现
对于一个新的
i
i
,如果大于队尾,
i
i
一定更优,所以需要不停的将队尾不优的元素弹出tail--
,直到队尾大于,保证了队列的单调性。
然后计算
f[i]
f
[
i
]
,把队头超出范围的元素弹出head++
。
队头元素即为最优取值。