形式
形如
dp[i]=max(dp[j]+g[j])+w[i] |(j≥f[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[x]+g[x]
递减(队头优于队尾),优先选择队头元素,当队头元素超出范围后弹出。
实现
对于一个新的
i
,如果
dp[i]+g[i]
大于队尾,
i
一定更优,所以需要不停的将队尾不优的元素弹出tail--
,直到队尾大于
dp[i]+g[i]
,保证了队列的单调性。
然后计算
f[i]
,把队头超出范围的元素弹出head++
。 队头元素即为最优取值。