ACM算法

偶然在論壇上看到了介紹一個搞ACM的需要掌握的算法的sheet。我感覺蠻有參考感的,在程序這條路上搞深了,結果肯定是算法和數學了,我就整理了下,好給自己提個醒


   ACM的競賽性強,因此自己應該和自己的實際應用聯繫起來.適合自己的纔是好的,有的人不適合搞算法,喜歡系統架構,因此不要看到別人什麼就眼紅,發揮自己的長處,這纔是重要的.(我覺得這句話說得很好的

第一階段:練經典常用算法,下面的每個算法要打得非常的熟練,同時自己精簡代碼,
因爲太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程序打
出來.(這個有點誇張吧?
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分查找. (代碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,代碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章