阅界资讯

单调队列优化 DP

阅阅界编辑部1阅读7分钟

刷到《单调队列优化 DP》,内容很实在,值得细读。这篇把它的关键做法提炼出来,帮你省下通读的时间,结尾附行动建议。

单调队列优化 DP 0. 定位 单调队列优化 DP,解决的是这样一类问题: 状态转移的「决策集合」是一个 随主状态单调滑动的窗口 ,且 决策的优劣可以提前与主状态 i 解耦 。满足这两点时,原本 O(nm) 的枚举被改为 O(n) 。 1. 朴素形态与优化动机 几乎所有这类 DP 都长这样: [代码示例略] L(i), R(i) 是决策 j 的合法区间; 若区间长度有界(如 R(i) − L(i) ≤ m ),朴素枚举为 O(nm) 。 优化的目标只有一个: 在每个 i 用 O(1) 取出窗口内最优的 j 。 2. 单调队列的本质原理 2.1 它是什么 一个 队首到队尾保持单调性的双端队列 : 求区间最小 → 维护 递增 队列(队首最小); 求区间最大 → 维护 递减 队列(队首最大)。 它能以 O(1) 均摊的代价 ,维护一个滑动窗口的最值。

单调队列优化 DP 0. 定位 单调队列优化 DP,解决的是这样一类问题: 状态转移的「决策集合」是一个 随主状态单调滑动的窗口 ,且 决策的优劣可以提前与主状态 i 解耦 。满足这两点时,原本 O(nm) 的枚举被改为 O(n) 。 1. 朴素形态与优化动机 几乎所有这类 DP 都长这样: [代码示例略] L(i), R(i) 是决策 j 的合法区间; 若区间长度有界(如 R(i) − L(i) ≤ m ),朴素枚举为 O(nm) 。 优化的目标只有一个: 在每个 i 用 O(1) 取出窗口内最优的 j 。 2. 单调队列的本质原理 2.1 它是什么 一个 队首到队尾保持单调性的双端队列 : 求区间最小 → 维护 递增 队列(队首最小); 求区间最大 → 维护 递减 队列(队首最大)。 它能以 O(1) 均摊的代价 ,维护一个滑动窗口的最值。 2.2 它为什么能优化 DP 关键不在「队列」本身,而在 决策的支配关系 : 处理到 i 时,把候选决策 j 依次加入队列; 若新决策 j₂ 比旧决策 j₁ ( j₁ < j₂ ) 更优 ,且 j₂ 比 j₁ 更晚离开窗口 (窗口右移,后进入者更晚被淘汰),那么 j₁ 在 j₂ 存活期间永远不可能再成为最优 → 永久淘汰 j₁ ; 于是队列里始终只保留「仍可能最优」的候选,且按优劣单调排列, 队首即当前窗口最优 。

单调队列优化 DP 0. 定位 单调队列优化 DP,解决的是这样一类问题: 状态转移的「决策集合」是一个 随主状态单调滑动的窗口 ,且 决策的优劣可以提前与主状态 i 解耦 。满足这两点时,原本 O(nm) 的枚举被改为 O(n) 。 1. 朴素形态与优化动机 几乎所有这类 DP 都长这样: [代码示例略] L(i), R(i) 是决策 j 的合法区间; 若区间长度有界(如 R(i) − L(i) ≤ m ),朴素枚举为 O(nm) 。 优化的目标只有一个: 在每个 i 用 O(1) 取出窗口内最优的 j 。 2. 单调队列的本质原理 2.1 它是什么 一个 队首到队尾保持单调性的双端队列 : 求区间最小 → 维护 递增 队列(队首最小); 求区间最大 → 维护 递减 队列(队首最大)。 它能以 O(1) 均摊的代价 ,维护一个滑动窗口的最值。 2.2 它为什么能优化 DP 关键不在「队列」本身,而在 决策的支配关系 : 处理到 i 时,把候选决策 j 依次加入队列; 若新决策 j₂ 比旧决策 j₁ ( j₁ < j₂ ) 更优 ,且 j₂ 比 j₁ 更晚离开窗口 (窗口右移,后进入者更晚被淘汰),那么 j₁ 在 j₂ 存活期间永远不可能再成为最优 → 永久淘汰 j₁ ; 于是队列里始终只保留「仍可能最优」的候选,且按优劣单调排列, 队首即当前窗口最优 。 注:这就是「单调」的真正含义: 维护的不是值的大小,而是候选决策的优劣序 。

单调队列优化 DP 0. 定位 单调队列优化 DP,解决的是这样一类问题: 状态转移的「决策集合」是一个 随主状态单调滑动的窗口 ,且 决策的优劣可以提前与主状态 i 解耦 。满足这两点时,原本 O(nm) 的枚举被改为 O(n) 。 1. 朴素形态与优化动机 几乎所有这类 DP 都长这样: [代码示例略] L(i), R(i) 是决策 j 的合法区间; 若区间长度有界(如 R(i) − L(i) ≤ m ),朴素枚举为 O(nm) 。 优化的目标只有一个: 在每个 i 用 O(1) 取出窗口内最优的 j 。 2. 单调队列的本质原理 2.1 它是什么 一个 队首到队尾保持单调性的双端队列 : 求区间最小 → 维护 递增 队列(队首最小); 求区间最大 → 维护 递减 队列(队首最大)。 它能以 O(1) 均摊的代价 ,维护一个滑动窗口的最值。 2.2 它为什么能优化 DP 关键不在「队列」本身,而在 决策的支配关系 : 处理到 i 时,把候选决策 j 依次加入队列; 若新决策 j₂ 比旧决策 j₁ ( j₁ < j₂ ) 更优 ,且 j₂ 比 j₁ 更晚离开窗口 (窗口右移,后进入者更晚被淘汰),那么 j₁ 在 j₂ 存活期间永远不可能再成为最优 → 永久淘汰 j₁ ; 于是队列里始终只保留「仍可能最优」的候选,且按优劣单调排列, 队首即当前窗口最优 。 注:这就是「单调」的真正含义: 维护的不是值的大小,而是候选决策的优劣序 。只要「更优且更晚淘汰 → 永久支配」成立,结构就成立。

单调队列优化 DP 0. 定位 单调队列优化 DP,解决的是这样一类问题: 状态转移的「决策集合」是一个 随主状态单调滑动的窗口 ,且 决策的优劣可以提前与主状态 i 解耦 。满足这两点时,原本 O(nm) 的枚举被改为 O(n) 。 1. 朴素形态与优化动机 几乎所有这类 DP 都长这样: [代码示例略] L(i), R(i) 是决策 j 的合法区间; 若区间长度有界(如 R(i) − L(i) ≤ m ),朴素枚举为 O(nm) 。 优化的目标只有一个: 在每个 i 用 O(1) 取出窗口内最优的 j 。 2. 单调队列的本质原理 2.1 它是什么 一个 队首到队尾保持单调性的双端队列 : 求区间最小 → 维护 递增 队列(队首最小); 求区间最大 → 维护 递减 队列(队首最大)。 它能以 O(1) 均摊的代价 ,维护一个滑动窗口的最值。 2.2 它为什么能优化 DP 关键不在「队列」本身,而在 决策的支配关系 : 处理到 i 时,把候选决策 j 依次加入队列; 若新决策 j₂ 比旧决策 j₁ ( j₁ < j₂ ) 更优 ,且 j₂ 比 j₁ 更晚离开窗口 (窗口右移,后进入者更晚被淘汰),那么 j₁ 在 j₂ 存活期间永远不可能再成为最优 → 永久淘汰 j₁ ; 于是队列里始终只保留「仍可能最优」的候选,且按优劣单调排列, 队首即当前窗口最优 。 注:这就是「单调」的真正含义: 维护的不是值的大小,而是候选决策的优劣序 。只要「更优且更晚淘汰 → 永久支配」成立,结构就成立。 2.3 可分离性(拆项) 要让「 j 的优劣」独立于 i ,必须能把代价写成: [代码示例略] f(j) 只与决策 j 有关, g(i) 只与主状态 i 有关。

读完别停:把最触动你的一条记下来,这周就用上。能落地的阅读才算数,欢迎回来聊聊你的实践结果。 来源|博客园《单调队列优化 DP》,https://www.cnblogs.com/lvwangshuOI/p/22956316.html

程序员技术场技术后端

评论(0)

暂无评论,来抢第一条。