閱界資訊

單調隊列優化 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)

暫無評論,來搶第一條。