【基础知识】——DP
优化
单调队列
用于优化内层循环,当内层循环总是有一个固定长度的时候,想一想滑动窗口,就可以试着用单调队列来更新了
共分为3步:(不是一成不变)
1.通过长度限制剔除队头
2.通过最优解限制剔除队尾,把当前元素入队
3.用队头更新答案
经典例题:
最大子段和(板子)
绿色通道(此处需要先更新答案,再踢队尾,因为最优解的判定需要当前结果)
C u t t h e S e q u e n c e Cut\; the \;Sequence CuttheSequence(这个与每段的最大值有关,无法直接转移队头,需要扫一遍整个队列,每次求最优解)
旅行问题 (注意单调队列的循环方向。这里注意前缀和的处理,并非直接从头加到尾,而是先给 s u m [ i ] , s u m [ i + n ] sum[i],sum[i+n] sum[i],sum[i+n]赋相同值,接着再进行前缀和)
斜率优化
可以把问题看成每次对一段区间进行操作
对于这样形式的 dp 方程: d p [ i ] = M i n / M a x ( a [ i ] × b [ j ] + c [ j ] + d [ i ] ) dp[i]=Min/Max(a[i]\times b[j]+c[j]+d[i]) dp[i]=Min/Max(a[i]×b[j]+c[j]+d[i])
该方程的关键点在于 a [ i ] × b [ j ] a[i]\times b[j] a[i]×b[j] 这一项,它既有 i 又有 j,于是单调队列优化不再适用,可以尝试使用斜率优化。
首先把式子变成 y = k x + b y=kx+b y=kx+b的形式,
其中 y y y为含 j j j的表达式, k , b k,b k,b为含 i i i的表达式或常量, x x x为含 j j