ACM知識點

 

ACM知識點


訓練過ACM等程序設計競賽的人在算法上有較大的優勢,這就說明當你編程能力提高之後,主要時間是花在思考算法上,不是花在寫程序與debug上。

下面給個計劃你練練:

 

第一階段:練經典常用算法,下面的每個算法給我打上十到二十遍,同時自己精簡代碼,因爲太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程序打出來。

 

1.最短路(FloydDijstra,BellmanFord) 

2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫

3.大數(高精度)加減乘除

4.二分查找. (代碼可在五行以內

5.叉乘、判線段相交、然後寫個凸包

6.BFSDFS,同時熟練hash(要熟,要靈活,代碼要簡

7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式

8. 調用系統的qsort, 技巧很多,慢慢掌握

9. 任意進制間的轉換

 

第二階段:練習複雜一點,但也較常用的算法。 

如: 

1. 二分圖匹配(匈牙利),最小路徑覆蓋 

2. 網絡流,最小費用流。 

3. 線段樹

4. 並查集。 

5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp 

6.博弈類算法。博弈樹,二進制法等。 

7.最大團,最大獨立集。 

8.判斷點在多邊形內。 

9. 差分約束系統

10. 雙向廣度搜索、A*算法,最小耗散優先.

 

第三階段:

    前兩個階段是打基礎,第三階段是鍛鍊在比賽中可以快速建立模型、想新算法。這就要平時多做做綜合的題型了。 

1. oibh上的論文看看(大概幾百篇的,我只看了一點點,呵呵)。 

2. 平時掃掃zoj上的難題啦,別老做那些不用想的題.(中大acm的版主經常說我挑簡單的來做:-P ) 

3. 多參加網上的比賽,感受一下比賽的氣氛,評估自己的實力

4. 一道題不要過了就算,問一下人,有更好的算法也打一下。 

5. 做過的題要記好 :-)

下面轉自:http://hi.baidu.com/wilworld/blog/item/88b1b844d37e4049500ffe6a.html

ACMer必備知識(任重而道遠......

 

圖論

 

   路徑問題

        0/1邊權最短路徑

        BFS

        非負邊權最短路徑(Dijkstra

            可以用Dijkstra解決問題的特徵

        負邊權最短路徑

        Bellman-Ford

            Bellman-FordYen-氏優化

            差分約束系統

        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

    有限狀態自動機理論

 

排序

    選擇/冒泡

    快速排序

    堆排序

    歸併排序

    基數排序

    拓撲排序

    排序網絡

 

 

ACM/ICPC要求的知識點

時間複雜度(漸近時間複雜度的嚴格定義,NP問題,時間複雜度的分析方法,主定理)
排序算法(平方排序算法的應用,Shell排序,快速排序,歸併排序,時間複雜度下界,三種線性時間排序,外部排序)
數論(整除,集合論,關係,素數,進位制,輾轉相除,擴展的輾轉相除,同餘運算,解線性同餘方程,中國剩餘定理)
指針(鏈表,搜索判重,鄰接表,開散列,二叉樹的表示,多叉樹的表示)
按位運算(and,or,xor,shl,shr,一些應用)
圖論(圖論模型的建立,平面圖,歐拉公式與五色定理,求強連通分量,求割點和橋,歐拉回路,AOV問題,AOE問題,最小生成樹的三種算法,最短路的三種算法,標號法,差分約束系統,驗證二分圖,Konig定理,匈牙利算法,KM算法,穩定婚姻系統,最大流算法,最小割最大流定理,最小費用最大流算法)
計算幾何(平面解幾及其應用,向量,點積及其應用,叉積及其應用,半平面相交,求點集的凸包,最近點對問題,凸多邊形的交,離散化與掃描)
數據結構(廣度優先搜索,驗證括號匹配,表達式計算,遞歸的編譯,Hash表,分段Hash,並查集,Tarjan算法,二叉堆,左偏樹,斜堆,二項堆,二叉查找樹,AVL,Treap,Splay,靜態二叉查找樹,2-d樹,線段樹,二維線段樹,矩形樹,Trie樹,塊狀鏈表)
組合數學(排列與組合,鴿籠原理,容斥原理,遞推,Fibonacci數列,Catalan數列,Stirling數,差分序列,生成函數,置換,Polya原理)
概率論(簡單概率,條件概率,Bayes定理,期望值)
矩陣(矩陣的概念和運算,二分求解線性遞推方程,多米諾骨牌棋盤覆蓋方案數,高斯消元)
字符串處理(KMP,後綴樹,有限狀態自動機,Huffman編碼,簡單密碼學)
動態規劃(單調隊列,凸完全單調性,樹型動規,多叉轉二叉,狀態壓縮類動規,四邊形不等式)
博奕論(Nim取子游戲,博弈樹,Shannon開關遊戲)
搜索(A*,ID,IDA*,隨機調整,遺傳算法)
微積分初步(極限思想,導數,積分,定積分,立體解析幾何)

 


1. ACM/lCPC要求的數據結構知識點
(1) 單雙鏈表及循環鏈表;
(2) 樹的表示與存儲,二叉樹(概念,遍歷);
(3) 二叉樹的應用(二叉排序樹,判定樹,博弈樹,解答樹等);
(4) 文件操作(從文本文件中讀人數據,並輸出到文本文件中;
(5) 圖 (基本概念,存儲結構,圖的運算);
ACM/ICPC要求學生對這些知識點非常熟悉。
2. ACM/ICPC要求的基礎數學知識點
離散數學知識的應用(如排列組合、簡單圖論、數理邏輯)、數論知識、線性代數、組合數學、計算幾何。
3. ACM/ICPC要求的算法設計知識點
排序算法 (冒泡法、插人排序、合併排序、快速排序、堆排序)、查找(順序查找、二分法)、回溯算法、遞歸算法、分治思想、模擬法、貪心法、簡單搜索算法(深度優先,廣度優先)、搜索中的剪枝、A*算法、動態規劃的思想及基本算法、高精度運算。

轉載:http://blog.csdn.net/mad2man/article/details/39778267


發佈了6 篇原創文章 · 獲贊 127 · 訪問量 86萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章