「动态规划」第4章 单调队列优化 DP

滑动窗口是单调队列优化dp的主要运用方面。

滑动窗口用于解决不断求求左右端点单调移动的区间的某种数值(一般是不可差分的,如最值,否则前缀和直接做就做完了)。做法是,每次移动右端点时将队尾劣于新点的pop掉,再将新点push进来;移动左端点时将超出左端点的pop掉。总的来说其实就是维护了一个单调变劣的单调栈,栈底是最优的,每次栈底不合法就去掉。

例题

A. 【例题1】滑动窗口

滑动窗口模版题。

B. 【例题2】最大连续和

注意到可以转化为前缀和求差分的问题,这样就可以用滑动窗口求区间最值解决了。

C. 【例题3】修剪草坪

运用一个小trick:设恰好在第 \(i\) 次休息表示为 \(dp_i\)

G. 瑰丽华尔兹

\(dp_{i,j,t}\) 表示在第 \(t\) 段时间结束时在 \(i,j\),能走过的最大距离。由于我们可以选择停下,所以我们能转移而来的位置是一段区间(从上一个位置到这段时间内能走到这里的最远位置),那么就可以用单调队列了。难点在于代码实现可能要分四个方向写四遍,容易写错。

H. 理想方形

甚至不用 单调队列。枚举矩形的位置,然后用单调队列或者二维st表求出最大最小值即可,

I. 股票交易

\(dp_{i,j}\) 表示第 \(i\) 天手里剩下 \(j\) 股的最大收益。注意到 \(w\) 的限制可以被表示为:从 \(i-w-1\) 天转移而来,因为某一天可以选择不买也不卖,所以这么转移就相当于从前面所有位置转移而来。而持股数的变化是一个区间,可以用单调队列维护。正做一遍,反做一遍即可。

posted @ 2025-05-18 22:41  Luke_li  阅读(21)  评论(0)    收藏  举报