一個搞ACM須要掌握的算法

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

相關文章
相關標籤/搜索