单调队列优化是利用状态转移时的单调性来对dp进行优化的一种做法,类似于斜率优化。
不同之处在于单调队列是将dp转移方程分解成$f(i) + g(j)$两部分,其中$f(i)$只与$i, j$中的$i$有关,$g(j)$只与$i, j$中的$j$有关。
我们看他如何在朴素dp是二维的情况下将复杂度降一个维度:
从$1 \ldots n$扫描,每到一个状态i,我们看$f(i - 1)$是否比队列尾更优,如果更优,从队尾循环弹出元素,直到$f(i)$不比队尾状态的$f$值更优,将其压入,并用队首元素更新$dp_i$。

似乎这个单调队列有时候可以只用一个变量来保存最值就好了,不过我做过的题少,我不知道我这个看法对不对。
不过UESTC上594题“我要长高”是可以这样做的。

下面提供UESTC 594的代码
https://github.com/cjsoft/noip/tree/master/after_lnoi/d0520
其中cdoj594.cpp是我照网络上的代码写出来的
cdoj594.copy.cpp是我徒手又写了一遍
anothercopy.cpp是使用一个变量+滚动数组写的