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

形式

形如

dp[i]=max(dp[j]+g[j])+w[i]  |(jf[i])

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

思路

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

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

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

实现

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