ACM 中經常使用的算法有哪些?算法
在網上看到別人ACM學習的心得,轉載過來,源地址不記得了,當時是百度的。內容以下:網絡
網絡上流傳的答案有不少,估計提問者也曾經去網上搜過。因此根據本身微薄的經驗提點見解。數據結構
我ACM初期是訓練編碼能力,以水題爲主(就是沒有任何算法,本身靠動腦筋可以實現的),這種題目特色是麻煩,可是不難,30-50道題目就能夠了。工具
而後能夠接觸一下基礎的算法,我感受搜索方向的比較不錯,能夠解決不少問題,深搜,廣搜,而後各類剪枝能力的鍛鍊。學習
搜索感受不錯了就能夠去看看貪心,圖論,和動態規劃方向的了。圖論有最短路徑,最小生成樹,網絡流,拓撲排序等等不少,動態規劃先去書上看經典例子,最長公共子序列等。各類變形的題目。編碼
數學是ACM中極具殺傷力的武器,我一貫很羨慕數學好的隊友,精力有限本身數學方面的算法只能說入門。這方面經典的數論,組合數學方面的比較多,計算幾何是很重要的,經典模型要熟悉,最近點對,二維三維,凸包以及各類應用。debug
數據結構方面的就比較多了,基礎的堆,棧,隊列,並查集,二叉查找樹,紅黑樹,trie樹,hash表等等。 用C++參賽的話STL要熟悉,有時候頗有幫助,裏面的queue,list,map,stack等。調試
ACM到後來算法就成了工具,不斷的靠本身意淫一個新的解法來解決問題是最開心的事情了。咱們學校ACM一直是一屆帶一屆的,老師只提供經濟上的援助,上面的內容是我在大三當隊長時教給大一的新隊員的入門內容,再深的就靠每一個人本身發掘了。排序
我年輕的時候也以爲ACM考察的是算法和coding隊列
年紀大了之後,我明白了,ACM考察的實際上是YY
有算法的題都是秒殺題,
難題都是YY一個方法,或是作一個畸形的變化轉成一個有固定解的模型
一位高手對個人建議:
通常要作到50行之內的程序不用調試、100行之內的二分鐘內調試成功.acm主要是考算法的,主要時間是花在思考算法上,不是花在寫程序與debug上。
下面給個計劃你練練:
第一階段:
練經典經常使用算法,下面的每一個算法給我打上十到二十遍,同時本身精簡代碼,由於太經常使用,因此要練到寫時不用想,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*算法,最小耗散優先.
第三階段:
前兩個階段是打基礎,第三階段是鍛鍊在比賽中能夠快速創建模型、想新算法
。這就要平時多作作綜合的題型了。
1. 把oibh上的論文看看(大概幾百篇的,我只看了一點點,呵呵)。
2. 平時掃掃zoj上的難題啦,別老作那些不用想的題.(中大acm的版主常常說我挑簡單的來作:-P )
3. 多參加網上的比賽,感覺一下比賽的氣氛,評估本身的實力.
4. 一道題不要過了就算,問一下人,有更好的算法也打一下。
5. 作過的題要記好
邏輯類:枚舉、貪心、動態規劃、深搜廣搜
結構類:棧、並查集、堆、樹、拓撲圖、圖論
幾何類:凸包
公式類:Fibonacci,排列組合,機率
幾何類的小算法不少,好比求點線關係;還有線性方程組、最大最小流;還有一些特定的算法:最短路徑、排序等。
我感受最其中重要的是搜索,搜索能夠對大部分問題提供通解,但會有效率問題,因而有雙向廣搜、A星搜索等等。在現實應用中,我以爲相對其餘一些來說,搜索也是比較有用的。