遞推
狀態
- 有什么,設什么
- 要什么,設什么
- 想什么,設什么
- 差分
- 摸
- 存路徑,存字符串
- 暴力存維
狀態方向
- 順推
- 倒推
轉移方程
- 策略
- 划分
- 補集
- 容斥
- 費用提前計算
- 階段內轉移(多選)
轉移方向
- 順轉移(壓范圍)
- 逆轉移
循環位置
枚舉順序
- 順序(單選)
- 倒序(無限選,多選可以轉向此處記次數)
- 區間枚舉(區間划分問題和區間遞推)
實現方式
- dfs
- bfs(拓撲排序)
- 階段
考慮角度
- 單調性
- 維護的角度
- 最優解與不優解的充分和必要條件
- 單個問題,忽略條件,整體來看,狀態思想
- 遞推優化dfs
- 重
- 分
- 少
最優子結構性質
- 加法恆滿足
- 不滿足分類討論
試填法
標志
- 求第幾個方案
- 求方案
做法
- 求方案
- 從大到小試填
- 求出確定了這個狀態下的方案數
模型
- 序列划分成區間
線性遞推
序列
其實就是子序列問題
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)\)
切入點
- 前i個(可以表現結尾)和以第i個結尾
方法
- 構造新序列
網格圖問題
考慮點
- 行列
- 對角線
- 矩形(枚舉2個頂點,cow式枚舉)
- 輪廓
- 長寬為1
奇特思路
- 拆行成列
- 行列獨立
背包
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)\)(順序枚舉)
多重
- 01二進制拆分
- 單調隊列
- 可行性問題轉完全記次數
分組
\(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)\)(倒序枚舉)
區間問題
切入點
維護
- 枚舉右端點,尋找左端點性質
關系
- 左右端點排序
- 包含
狀態
- 位置,區間(設的狀態)
區間遞推
標志
- 相鄰兩點合並
- 具有區間性(如dfs序)
模型
dfs序
- 根節點在序列中划分子樹
- 一段區間可以對應一棵子樹
- 子樹可以拆分,區間也可以拆分
環形遞推
切入點
- 先拆環成鏈,再
- 再補一截
- 二次遞推
- 記錄一截
拆環划分
- 區間長度作為階段
進制壓縮
標志
1~20間的數據范圍,即極小的數據范圍
切入點
- 不限於二進制(二進制更快)
- 靈活運用二進制運算(\(\wedge,\&,|,!\),~)
- 多預處理
- 多剪枝
絕對值問題
切入點
- 拆
- 存
模型
- \(\sum_{i=1}^n|x-a_i|\)最小,取中位數
- \(\sum_{i=1}^n|b_i-a_i|\)暴力存維
有后效性的遞推
高斯消元
細節
- 先增廣后eam防錯
- 從最高位消比較好
數學期望
切入點
轉移方式 | 特點1 | 特點2 | 特點3 |
---|---|---|---|
公式 | 概率很固定 | 枚舉方案 | 要判非法狀態 |
順推 | 概率較固定 | 階段轉移 | 要判非法狀態 |
倒推 | 概率不固定 | 點點轉移 | 不判非法狀態 |
- 樣本空間無限無后效性遞推處理
模型
條件概率
切入點:數學歸納法證明概率相等
二進制運算
切入點:
- 二進制運算不進位
- 間接概率轉移
有向無環圖
切入點:
單個點,單條邊,環,圖轉dag,dag轉樹,森林合並
異或和路徑
切入點:
- 線性基
- 瞬間轉移
- 環環轉換
- 二進制拆分
細節
- 自環
數據范圍
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)\)
樹形遞推
標志
- 有依賴的類背包問題
- 樹上的問題
切入點
- 森林合並
- 無根變有根
- 換根法二次遞推(不限於最優化問題,如要求多個節點特征也可用)
細節
- 葉結點特判
優化
預處理
貪心,排序
轉換模型
二進制優化
二進制壓縮
倍增
- 轉移方向確定
- 循環節
- 同余
- 最值(ST表)
- 第k大
二進制拆分
二分
空間優化
滾動數組
- 異或版
- 與版
動態數組
- vector
- new
區間和
前綴和
樹狀數組
性質
- 一棵樹
- x所包含的數據范圍為\(x-lowbit(x)+1\sim x\)
- x的父節點為\(x+lowbit(x)\)
- x的最遠子節點為\(x-lowbit(x)+1\)
- x的子節點為\(x-2^k\),其中,\(0<2^k<lowbit(x)\)
區間最值維護
- 修改
- 更改原數組
- 暴力從子節點中獲取數據
- 跳到下一個節點
時間復雜度:\(O((log_2^n)^2)\)
- 查詢
- 如果r的包含數據范圍在\([l,r]\),計入答案
- 如果不包括,查詢\([l,r-1]\)
時間復雜度:\(O((log_2^n)^2)\)
線段樹
- 區間合並性
- 區間信息快速更新性(標記下放)
維護
基本思想
- (思路)從簡單到困難,特殊到一般
- (枚舉)確定一個枚舉點,再尋找最優解,提供暴力
- (信息)利用以前的信息求出現在的信息
棧與隊列
單調性
單調隊列
- 決策范圍單調
優先隊列
如雙堆對頂(動態維護第k大)
平衡樹
可維護最值
二分(二分,三分查找)
離散化
列式
其他維護方式
矩陣快速冪
輔助1
斜率優化
截距版
- 單調隊列——決策范圍單調+斜率單調
- 單調隊列+二分查找——決策范圍單調or斜率單調[倒推]
- 多比較平衡樹——無單調性
斜率版
思路過程(可以推廣到整個斜率優化)
- 上凸三角形和下凸三角形以及其本質
- 維護上下凸殼
- 單調隊列和平衡樹
- 函數的單調性,用圖像研究問題
- 只考慮問題的三個點,簡化研究,再推廣
四邊形不等式
常見模型
最大相同矩陣
- 按行枚舉,再按列枚舉
- 暴力預處理高度
- 單調隊列維護該列最左能到達范圍
數列前綴和
- 分治
- 矩陣快速冪
- 倍增前綴和
一維無乘積決策單調性
\(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\)。