本人親手整理,用html一個字一個字敲的Orz,看在我那么不容易的份上就點個關注吧(后續會根據更新的文章不斷的加上超鏈接來便於大家查詢、觀看)ps.文末附oi知識表
算法思想
- 模擬
- 搜索 (Search) 枚舉(窮舉) / 遍歷 / 剪枝 / 產生式系統(估價函數)/雙向BFS/記憶化搜索
- 查找(字典):折半查找(二分法) / 樹形查找(二叉排序樹) / Hash
- 遞推或歸納(To 數學方法) > 遞推式 > DP
- 分治(Divided and Conquer) > 二分答案
- 貪心 (Greedy)
實現技巧
- 循環
- 遞推(順/逆) > 博弈 > DP
- 遞歸(棧/DFS)
- 滾動數組
- 冪
- x ^ y = exp(y*ln(x))
- x ^ (1/n) = exp(1/n*ln(x))
數學方法
- 數論:質數 / 因數 / 約數個數(種數)/ 最大公約數 / 最小公倍數 / 回文數/擴展歐幾里得/快速冪/線性篩法/逆元/歐拉函數……
- 進制轉換(注意負進制)
- 高精度運算(考得不多)
- 排列組合:全排列、二項式定理
- 經典遞推關系:
- Fibonacci
- fib(1)=1 ;fib(2)=1
- fib(n)=fib(n-1)+fib(n-2)
- 通項:設g5=sqrt(5) 則fib(n)=(1/g5)*( ((1+g5)/2)^n-((1-g5)/2)^n )
- Catalan數 :Catalan(n)=C(n,2*n)/(n+1)
- 高斯消元(省選內容)
數據結構(Data Structure)
- 物理結構
- 數組 > 二維平面/字符串(Ansistring)及其操作
- 指針 > 鏈表 (單鏈表 / 雙向鏈表 / 環狀鏈表)
- 抽象數據結構(Abstract Data Type)
- 初級ADT
- 集合
- 線性結構
- 棧(LIFO表)
- 后綴表達式
- 進出站序列問題(Catalan 枚舉 > 歸納)
- DFS
- 隊列(FIFO表)
- BFS
- 求和廣義線性表
- 非線性結構
- 樹(多是二叉)
- 樹的遍歷:前/中/后(遞歸實現)
- 最優二叉樹(哈夫曼樹Huffman tree)(貪心)
- 二叉堆
- 樹規(樹形DP)
- Trie樹(字典樹)
- 圖(graph)
- 圖的遍歷:
- DFS
- BFS
- 最小生成樹:(貪心)
- Prim:邊稠密
- Kruskal: 邊稀疏(排序 + 並查集)
- 最短路徑算法:
- Dijkstra(單源 O(n2) BFS )
- Floyed(所有點間 O(n3) )
- Bellman-Ford(負權環)
- SPFA
- 拓撲序列
- 關鍵路徑(AOV網)
- 無向圖傳遞閉包、有向圖強連通分量SCC
- 路、回路
- 二分圖匹配
- LCA、RMQ
- 高級ADT
- 集合型
- 並查集(disjoint-set)
- 字典型
- 哈希(hash)
- 樹型
- 二叉堆(Heap) > Treap
- Binary Search Tree(BST)
- 線段樹、樹狀數組、樹鏈剖分......
排序算法
- O(n2)
- 直接插入排序(Inserting Sort)
- 直接選擇排序(Choosing Sort)
- 冒泡排序(Bubble Sort)
- O(nlongn)
- 堆排(Heap Sort)
- 快排(Quick Sort)
- 歸並(Merge Sort)
- O(n)
- 基數排序(Radix Sort)
- 計數排序(Counting Sort)
- 桶排序(Bucket Sort)
動態規划(Dynamic programming)
- 注意事項
- 狀態轉移方程+邊界條件
- 合適的實現方法(To 實現技巧)
- 經典題目
- 最長不下降(上升)序列
- 最大子段和 & 最大M子段和
- 最長公共子序列(LCS)
- 區間DP(鏈,環)
- 背包問題
- 01背包-可重復(DP)
- 01背包-不可重復(DP)
- 完全背包
- 部分背包(貪心)
- 狀壓DP
- DP的簡單優化(滾動數組、數據結構優化、隊列優化)
博弈問題
- 關鍵字:必勝態 / 必敗態
- 遞推找規律
- 歸納法
另附一張OI知識表(Ctrl+滾輪手動放大)