大牛給的ACM進階建議

轉:https://blog.csdn.net/mmy1996/article/details/56011084html

 


來自知乎java

在他後面的回答中發現 不用IDE ,修煉內功挺好的,不過他和個人之前的那種 用 潛意識寫代碼 挺類似的算法

 

一位高手的建議:編程

通常要作到50行之內的程序不用調試、100行之內的二分鐘內調試成功.數組

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

下面給個計劃你練練:網絡

第一階段:練經典經常使用算法,下面的每一個算法給我打上十到二十遍,同時本身精簡代碼,由於太經常使用,因此要練到寫時不用想,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*算法,最小耗散優先.post

第三階段:
前兩個階段是打基礎,第三階段是鍛鍊在比賽中能夠快速創建模型、想新算法。這就要平時多作作綜合的題型了。
1. 把oibh上的論文看看(大概幾百篇的,我只看了一點點,呵呵)。
2. 平時掃掃zoj上的難題啦,別老作那些不用想的題.(中大acm的版主常常說我挑簡單的來作:-P )
3. 多參加網上的比賽,感覺一下比賽的氣氛,評估本身的實力.
4. 一道題不要過了就算,問一下人,有更好的算法也打一下。
5. 作過的題要記好 :-)

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

算法書有不少能夠參考:

一、Concrete Mathematics — A Foundation For Computer Science
Ronald L. Graham , Donald E. Knuth , Oren Patashnik
  這本書《具體數學》是Stanford計算機系的教材(1970 年開始給研究生授課),書的內容是Knuth的鉅著TAOCP第一章的擴展,涉及了計算機科學領域內幾乎全部可能遇到的數學知識。書中許多經典問題的解答比目前普遍流傳的解法更易懂。對於提升你們的數學修養有很大幫助。

二、Introduction to Algorithms
Thomas H. Cormen ,Charles E. Leiserson ,Ronald L. Rivest ,Clifford Stein
  《算法導論》MIT計算機系的經典算法教材。做者Rivest得到過ACM Turing Award,牛!本書內容全面,語言通俗,很適合你們入門。

三、實用算法的分析和程序設計
吳文虎 王建德
  大名鼎鼎的「黑書」。內容包括了競賽須要的各類算法,各類層次的讀者都適合。

【這裏是我本身加的:其實所謂」黑書」,還有一本,《算法藝術與信息學競賽》做者:劉汝佳 黃亮,很經典,很流行】
四、網絡算法與複雜性理論
謝政 李建平
  內容很豐富的圖論教材

五、算法+數據結構=程序
N.Wirth
  Pascal語言的發明人Wirth教授的名著,深刻闡述了算法與數據結構的關係,對每一個算法都提供詳細的Pascal源程序,適合各類水平的讀者。

  最後,在學習算法提高戰鬥力的同時,也要多作題目,實戰是頗有必要的。其實並非全部的題目都是靠算法的,有一些題目是有多種能夠優化的手段,也有一些工程性比較強的題目。上手作和把題作精仍是有很大區別的(慚愧的說,我就是屬於上手作,沒有作精,因此……)。

  願每一位程序設計競賽愛好者挑戰極限!

=============================================================================
ACMer必備知識(任重而道遠……)

圖論

路徑問題
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

  

動態規劃 / 記憶化搜索

動態規劃和記憶化搜索在思考方式上的區別

組織結構
    二叉堆
    左偏樹
    二項樹
    勝者樹
    跳躍表
    樣式圖標
    斜堆
    reap

統計結構
    樹狀數組
    虛二叉樹
    線段樹
        矩形面積並
        圓形面積並

關係結構
    Hash表
    並查集
        路徑壓縮思想的應用

STL中的數據結構
    vector
    deque
    set / map

  

線性規劃

經常使用思想

二分
最小表示法

KMP
Trie結構
後綴樹/後綴數組
LCA/RMQ
有限狀態自動機理論

排序 

選擇/冒泡 快速排序 堆排序 歸併排序 基數排序 拓撲排序 排序網絡

相關文章
相關標籤/搜索