【单调队列优化dp】

参考洛谷p1440求m区间内的最小值、洛谷p1725琪露诺

1.单调队列:p1440求m区间内的最小值(滑动窗口)

对于一组数据,多次求一个区间内的最值,可以用一个双端队列deque维护,

struct node
{
    int val;//要比较的值
    int pos;//这个值在这组数据中的位置
}v[N];
min_que[0] = 0;
int head = 1,tail = 0;
for(int i = 1; i < n; i++){
    while((head <= tail)&&(v[tail].val >= a[i - 1]))
               tail--;//tail移动到从尾端数第一个小于该数的位置
    v[++tail].val = a[i - 1];
    v[tail].pos = i - 1;//将该数据放到队列中
    while((head <= tail)&&(v[head].pos < i - m))
                head++;//将不在这个区间内的头部去掉,
    //中间的暂时不用去掉,因为只会用到头部
    min_que[i] = v[head].val;
}

2.单调队列优化dp:

有一种dp要寻找从 i 到 j 中最大的 dp[k] ,此时可以利用单调队列来优化

你可能感兴趣的:(【单调队列优化dp】)