ACM的競賽性強,所以本身應該和本身的實際應用聯繫起來.適合本身的纔是好的,有的人不適合搞算法,喜歡系統架構,所以不要看到別人什麼就眼紅,發揮本身的長處,這纔是重要的.java
第一階段:練經典經常使用算法,下面的每一個算法要打得很是的熟練,同時本身精簡代碼,
由於太經常使用,因此要練到寫時不用想,10-15分鐘內打完算法
1.最短路(Floyd、Dijstra,BellmanFord)數組
2.最小生成樹(先寫個prim,kruscal要用並查集,很差寫)網絡
3.大數(高精度)加減乘除數據結構
4.二分查找. (代碼可在五行之內)閉包
5.叉乘、判線段相交、而後寫個凸包.架構
6.BFS、DFS,同時熟練hash表(要熟,要靈活,代碼要簡)ide
7.數學上的有:展轉相除(兩行內),線段交點、多角形面積公式.函數
展轉相除優化
用處:
展轉相除法, 又名歐幾里德算法(Euclidean algorithm)乃求兩個正整數之最大公因子的算法.
定義:
設兩數爲a、b(a>b),求a和b最大公約數(a,b)的步驟以下:用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,則(a,b)=b;若r1≠0,則再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,則(a,b)=r1,若r2≠0,則繼續用r1除r2,……如此下去,直到能整除爲止。其最後一個爲被除數的餘數的除數即爲(a,b)。
例如:a=25,b=15,a/b=1......10,b/10=1......5,10/5=2.......0,最後一個爲被除數餘數的除數就是5,5就是所求最大公約數。
證實:
設兩數爲a、b(b<a),用gcd(a,b)表示a,b的最大公約數,r=a mod b 爲a除以b之後的餘數,k爲a除以b的商,即a÷b=k.......r。展轉相除法便是要證實gcd(a,b)=gcd(b,r)。
第一步:令c=gcd(a,b),則設a=mc,b=nc
第二步:根據前提可知r =a-kb=mc-knc=(m-kn)c
第三步:根據第二步結果可知c也是r的因數
第四步:能夠判定m-kn與n互質【不然,可設m-kn=xd,n=yd,(d>1),則m=kn+xd=kyd+xd=(ky+x)d,則a=mc=(ky+x)dc,b=nc=ycd,故a與b最大公約數成爲cd,而非c,與前面結論矛盾】
從而可知gcd(b,r)=c,繼而gcd(a,b)=gcd(b,r)。
證畢。
/** * 求a,b之間的最大公約數,這裏要求a>b * @param a * @param b * @return */ public static int getMaxPublicNumber(int a,int b){ return (a % b == 0 ) ? b : getMaxPublicNumber(b, a % b); }
8. 調用系統的qsort, 技巧不少,慢慢掌握.
9. 任意進制間的轉換
第二階段:練習複雜一點,但也較經常使用的算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網絡流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類算法。博弈樹,二進制法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜索、A*算法,最小耗散優先.
===========================================================================================
圖論
路徑問題
0/1邊權最短路徑
BFS
非負邊權最短路徑(Dijkstra)
能夠用Dijkstra解決問題的特徵
負邊權最短路徑
Bellman-Ford
Bellman-Ford的Yen-氏優化
差分約束系統
Floyd
廣義路徑問題
傳遞閉包
極小極大距離 / 極大極小距離
Euler Path / Tour
圈套圈算法
混合圖的 Euler Path / Tour
Hamilton Path / Tour
特殊圖的Hamilton Path / Tour 構造
生成樹問題
最小生成樹
第k小生成樹
最優比率生成樹
0/1分數規劃
度限制生成樹
連通性問題
強大的DFS算法
無向圖連通性
割點
割邊
二連通分支
有向圖連通性
強連通分支
2-SAT
最小點基
有向無環圖
拓撲排序
有向無環圖與動態規劃的關係
二分圖匹配問題
通常圖問題與二分圖問題的轉換思路
最大匹配
有向圖的最小路徑覆蓋
0 / 1矩陣的最小覆蓋
完備匹配
最優匹配
穩定婚姻
網絡流問題
網絡流模型的簡單特徵和與線性規劃的關係
最大流最小割定理
最大流問題
有上下界的最大流問題
循環流
最小費用最大流 / 最大費用最大流
弦圖的性質和斷定
===========================================================================================
組合數學
解決組合數學問題時經常使用的思想
逼近
遞推 / 動態規劃
機率問題
Polya定理
計算幾何 / 解析幾何
計算幾何的核心:叉積 / 面積
解析幾何的主力:複數
基本形
點
直線,線段
多邊形
凸多邊形 / 凸包
凸包算法的引進,捲包裹法
Graham掃描法
水平序的引進,共線凸包的補丁
完美凸包算法
相關斷定
兩直線相交
兩線段相交
點在任意多邊形內的斷定
點在凸多邊形內的斷定
經典問題
最小外接圓
近似O(n)的最小外接圓算法
點集直徑
旋轉卡殼,對踵點
多邊形的三角剖分
=========================================================================================
數學 / 數論
最大公約數
Euclid算法
擴展的Euclid算法
同餘方程 / 二元一次不定方程
同餘方程組
線性方程組
高斯消元法
解mod 2域上的線性方程組
整係數方程組的精確解法
矩陣
行列式的計算
利用矩陣乘法快速計算遞推關係
分數
分數樹
連分數逼近
數論計算
求N的約數個數
求phi(N)
求約數和
快速數論變換
……
素數問題
機率判素算法
機率因子分解
==========================================================================================
數據結構
組織結構
二叉堆
左偏樹
二項樹
勝者樹
跳躍表
樣式圖標
斜堆
reap
統計結構
樹狀數組
虛二叉樹
線段樹
矩形面積並
圓形面積並
關係結構
Hash表
並查集
路徑壓縮思想的應用
STL中的數據結構
vector
deque
set / map
動態規劃 / 記憶化搜索
動態規劃和記憶化搜索在思考方式上的區別
最長子序列系列問題
最長不降低子序列
最長公共子序列
最長公共不降低子序列
一類NP問題的動態規劃解法
樹型動態規劃
揹包問題
動態規劃的優化
四邊形不等式
函數的凸凹性
狀態設計
規劃方向
=========================================================================================
線性規劃
經常使用思想
二分 最小表示法
串
KMP Trie結構
後綴樹/後綴數組 LCA/RMQ
有限狀態自動機理論
排序
選擇/冒泡
快速排序
堆排序
歸併排序
基數排序
拓撲排序
排序網絡
========================================================================================
初期:
一.基本算法:
(1)枚舉. (poj1753,poj2965) (2)貪心(poj1328,poj2109,poj2586)
(3)遞歸和分治法. (4)遞推.
(5)構造法.(poj3295) (6)模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖算法:
(1)圖的深度優先遍歷和廣度優先遍歷.
(2)最短路徑算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
(3)最小生成樹算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
(4)拓撲排序 (poj1094)
(5)二分圖的最大匹配 (匈牙利算法) (poj3041,poj3020)
(6)最大流的增廣路算法(KM算法). (poj1459,poj3436)
三.數據結構.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、歸併排(與逆序數有關)、堆排) (poj2388,poj2299)
(3)簡單並查集的應用.
(4)哈希表和二分查找等高效查找法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼樹(poj3253)
(6)堆
(7)trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜索
(1)深度優先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)廣度優先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)簡單搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
(1)揹包問題. (poj1837,poj1276)
(2)型以下表的簡單DP(可參考lrj的書 page149):
1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
2.E[i,j]=opt{D