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