遞推知識點小結


遞推

狀態

  1. 有什么,設什么
  2. 要什么,設什么
  3. 想什么,設什么
  4. 差分
  5. 存路徑,存字符串
  6. 暴力存維

狀態方向

  1. 順推
  2. 倒推

轉移方程

  1. 策略
  2. 划分
  3. 補集
  4. 容斥
  5. 費用提前計算
  6. 階段內轉移(多選)

轉移方向

  1. 順轉移(壓范圍)
  2. 逆轉移

循環位置

枚舉順序

  1. 順序(單選)
  2. 倒序(無限選,多選可以轉向此處記次數)
  3. 區間枚舉(區間划分問題和區間遞推)

實現方式

  1. dfs
  2. bfs(拓撲排序)
  3. 階段

考慮角度

  1. 單調性
  2. 維護的角度
  3. 最優解與不優解的充分和必要條件
  4. 單個問題,忽略條件,整體來看,狀態思想
  5. 遞推優化dfs

最優子結構性質

  1. 加法恆滿足
  2. 不滿足分類討論

試填法

標志

  1. 求第幾個方案
  2. 求方案

做法

  1. 求方案
  2. 從大到小試填
  3. 求出確定了這個狀態下的方案數

模型

  1. 序列划分成區間

線性遞推

序列

其實就是子序列問題

LIS

\(f_i=\max_{j=1}^{i-1}(f_j)+1\)

\(f_{++t}=a_i(a_i\geq f_t)\)

\(f_j=a_i(f_j>a_i),j\)盡可能小

(貪心優化)

lCS

\(f[i][j]=\max(f[i-1][j],f[i][j-1])(a[i]\neq b[j])\)

\(f[i][j]=f[i-1][j-1]+1(a[i]=b[j])\)

LCIS

\(f[i][j]=f[i][j-1](a[i]\neq b[j])\)

\(f[i][j]=\max_{k=1,a[k]\leq b[j]}^{i-1}(f[k][j-1])(a[i]=b[j])\)(決策集合優化)

成為LIS的最少修改次數

len(總)-len(LIS)

成為LSIS的最少修改次數

len(總)-len(LSIS(b))\((b_i=a_i-i)\)

切入點

  1. 前i個(可以表現結尾)和以第i個結尾

方法

  1. 構造新序列

網格圖問題

考慮點

  1. 行列
  2. 對角線
  3. 矩形(枚舉2個頂點,cow式枚舉)
  4. 輪廓
  5. 長寬為1

奇特思路

  1. 拆行成列
  2. 行列獨立

背包

01

\(f[i][j]=max(f[i][j],f[i-1][j-w_i]+c_i)\)

\(f_j=max(f_{j-w_i}+c_i,f_j)\)(倒序枚舉)

完全

\(f[i][j]=max(f[i][j-w_i]+c_i,f[i-1][j])\)

\(f_j=max(f_j,f_{j-w_i}+c_i)\)(順序枚舉)

多重

  1. 01二進制拆分
  2. 單調隊列
  3. 可行性問題轉完全記次數

分組

\(f[i][j]=max(f[i][j],f[i-1][j-w_k]+c_k)\)

\(f_j=max(f_j,f_{j-w_k}+c_k)\)(倒序枚舉)

區間問題

切入點

維護

  1. 枚舉右端點,尋找左端點性質

關系

  1. 左右端點排序
  2. 包含

狀態

  1. 位置,區間(設的狀態)

區間遞推

標志

  1. 相鄰兩點合並
  2. 具有區間性(如dfs序)

模型

dfs序

  1. 根節點在序列中划分子樹
  2. 一段區間可以對應一棵子樹
  3. 子樹可以拆分,區間也可以拆分

環形遞推

切入點

  • 先拆環成鏈,再
  1. 再補一截
  2. 二次遞推
  3. 記錄一截
    拆環划分
  • 區間長度作為階段

進制壓縮

標志

1~20間的數據范圍,即極小的數據范圍

切入點

  1. 不限於二進制(二進制更快)
  2. 靈活運用二進制運算(\(\wedge,\&,|,!\),~)
  3. 多預處理
  4. 多剪枝

絕對值問題

切入點

模型

  1. \(\sum_{i=1}^n|x-a_i|\)最小,取中位數
  2. \(\sum_{i=1}^n|b_i-a_i|\)暴力存維

有后效性的遞推

高斯消元

細節

  1. 先增廣后eam防錯
  2. 從最高位消比較好

數學期望

切入點

轉移方式 特點1 特點2 特點3
公式 概率很固定 枚舉方案 要判非法狀態
順推 概率較固定 階段轉移 要判非法狀態
倒推 概率不固定 點點轉移 不判非法狀態
  1. 樣本空間無限無后效性遞推處理

模型

條件概率

切入點:數學歸納法證明概率相等

二進制運算

切入點:

  1. 二進制運算不進位
  2. 間接概率轉移

有向無環圖

切入點:

單個點,單條邊,環,圖轉dag,dag轉樹,森林合並

異或和路徑

切入點:

  1. 線性基
  2. 瞬間轉移
  3. 環環轉換
  4. 二進制拆分

細節

  1. 自環

數據范圍

1~5暴力存維

1~20進制壓縮

50~100 \(O(n^4)\)

100~300 \(O(n^3)\)

1000~9000 \(O(n^2)\)

~\(10^5\)~ \(O(n\sqrt{n})\)

~\(10^6\)~ \(O(nlog^n)\)

~\(10^7\)~ \(O(n)\)

\(10^9\)~ \(O(log^n)\)

樹形遞推

標志

  1. 有依賴的類背包問題
  2. 樹上的問題

切入點

  1. 森林合並
  2. 無根變有根
  3. 換根法二次遞推(不限於最優化問題,如要求多個節點特征也可用)

細節

  1. 葉結點特判

優化

預處理

貪心,排序

轉換模型

二進制優化

二進制壓縮

倍增

  1. 轉移方向確定
  2. 循環節
  3. 同余
  4. 最值(ST表)
  5. 第k大

二進制拆分

二分

空間優化

滾動數組

  1. 異或版
  2. 與版

動態數組

  1. vector
  2. new

區間和

前綴和

樹狀數組

性質

  1. 一棵樹
  2. x所包含的數據范圍為\(x-lowbit(x)+1\sim x\)
  3. x的父節點為\(x+lowbit(x)\)
  4. x的最遠子節點為\(x-lowbit(x)+1\)
  5. x的子節點為\(x-2^k\),其中,\(0<2^k<lowbit(x)\)

區間最值維護

  • 修改
  1. 更改原數組
  2. 暴力從子節點中獲取數據
  3. 跳到下一個節點

時間復雜度:\(O((log_2^n)^2)\)

  • 查詢
  1. 如果r的包含數據范圍在\([l,r]\),計入答案
  2. 如果不包括,查詢\([l,r-1]\)

時間復雜度:\(O((log_2^n)^2)\)

線段樹

  1. 區間合並性
  2. 區間信息快速更新性(標記下放)

維護

基本思想

  1. (思路)從簡單到困難,特殊到一般
  2. (枚舉)確定一個枚舉點,再尋找最優解,提供暴力
  3. (信息)利用以前的信息求出現在的信息

棧與隊列

單調性

單調隊列

  1. 決策范圍單調

優先隊列

如雙堆對頂(動態維護第k大)

平衡樹

可維護最值

二分(二分,三分查找)

離散化

列式

其他維護方式

矩陣快速冪

輔助1

斜率優化

截距版

  1. 單調隊列——決策范圍單調+斜率單調
  2. 單調隊列+二分查找——決策范圍單調or斜率單調[倒推]
  3. 多比較平衡樹——無單調性

斜率版

完美例題

思路過程(可以推廣到整個斜率優化)

  1. 上凸三角形和下凸三角形以及其本質
  2. 維護上下凸殼
  3. 單調隊列和平衡樹
  4. 函數的單調性,用圖像研究問題
  5. 只考慮問題的三個點,簡化研究,再推廣

四邊形不等式

常見模型

最大相同矩陣

  1. 按行枚舉,再按列枚舉
  2. 暴力預處理高度
  3. 單調隊列維護該列最左能到達范圍

數列前綴和

  1. 分治
  2. 矩陣快速冪
  3. 倍增前綴和

一維無乘積決策單調性

\[f_i=\max_{l_i\leq a_j\leq r_i}\{f_j\} \]

\(l_i\)是否單調 \(a_j\)是否單調 \(r_i\)是否單調 維護辦法
單調隊列;離散化+線段樹or樹狀數組
離散化+線段樹or樹狀數組
\(double\ set\);離散化+線段樹or樹狀數組
離散化+線段樹or樹狀數組
離散化+線段樹or樹狀數組
離散化+線段樹or樹狀數組
離散化+線段樹or樹狀數組
離散化+線段樹or樹狀數組

習題

隨機序列

有一個長度為n的隨機序列,元素范圍\([1,x]\),每個數出現在每個位置概率固定,接下來有m次試驗,每次實驗有一個\([l,r]\)表示研究隨機序列的區間\([l,r]\),並生成一個隨機序列,把試驗結果記做區間中的最小值,現在詢問所有試驗結果最大值的期望,\(x,n\leq 300\)

遷徙

有n個東西向的村庄,自西向東標號為1~n,第i個村庄有一個屬性\(a_i,b_i\),定義兩個村庄i,j(i<j)的距離\(dis(i,j)=\sum_{k=i}^jb_k\)

現在有q個人,每個人有一個大轉盤和一個要行走的最多距離x,轉盤上有36個點,標號1~36,有一個點p被標記,從村庄s出發,向東移動,如果目前停留的村庄為i,就把一個球放在轉盤上的點1,每次順時針旋轉\(a_i\)格,如果能夠走到點p,則下一個前往的村庄j為滿足\(a_i\geq a_j\)條件下,距離最近的村庄,如果不能走到p,則下一個前往的村庄j為滿足\(a_i< a_j\)條件下,距離最近的村庄,如果不存在下一個前往的村庄,就停止不動,請輸出每一個人所能最終到達的村庄編號。

\(1\leq n\leq 10^5,1\leq a_i,b_i\leq 10^9,1\leq p\leq 36,q\leq 10^5\)

奇怪的多元組

給出n個\(m\)元組以及其序號,現在有q個詢問,由三種詢問組成:給出m元組的序號,刪除這個m元組;加入一個m元組;給出數字a,b,表示查詢m元組中第a元的最小值。\(n\leq 10000,m\leq 100,q\leq 5000\).

決斗

給出一個\(n\times m\)的網格圖,保證m為奇數,從網格第一行的中間開始,在第一行的上面放上數字\((m+1)/2\),然后一次向兩邊放數字,放的數字依次遞減,如\(m=5\),你應該放的是\(1\ 2\ 3\ 2\ 1\),現在有一個人在網格圖上,初始位置\((s,t)\)已經給出,背對着第一列,現在該人可以等概率向上,向下,向右,向左,留在原地轉身射擊,詢問其射中的數字的數學期望,\(n,m\leq 1000\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM