acm學(xué)習(xí)計劃
acm學(xué)習(xí)計劃
進(jìn)了ACM之后感覺不知道方向,好像什么都不會什么都該學(xué),但又不知道該從哪里學(xué)起,下面是學(xué)習(xí)啦小編為你搜集到的acm學(xué)習(xí)計劃。希望對你有所幫助。
acm學(xué)習(xí)計劃
第一階段:
練經(jīng)典常用算法,下面的每個算法給我打上十到二十遍,同時自己精簡代碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內(nèi)打完,甚至關(guān)掉顯示器都可以把程序打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用并查集,不好寫)
3.大數(shù)(高精度)加減乘除
4.二分查找. (代碼可在五行以內(nèi))
5.叉乘、判線段相交、然后寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,代碼要簡)
7.數(shù)學(xué)上的有:輾轉(zhuǎn)相除(兩行內(nèi)),線段交點、多角形面積公式.
8. 調(diào)用系統(tǒng)的qsort, 技巧很多,慢慢掌握.
9. 任意進(jìn)制間的轉(zhuǎn)換
第二階段:
練習(xí)復(fù)雜一點,但也較常用的算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網(wǎng)絡(luò)流,最小費用流。
3. 線段樹.
4. 并查集。
5. 熟悉動態(tài)規(guī)劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類算法。博弈樹,二進(jìn)制法等。
7.最大團(tuán),最大獨立集。
8.判斷點在多邊形內(nèi)。
9. 差分約束系統(tǒng).
10. 雙向廣度搜索、A*算法,最小耗散優(yōu)先.
第三階段:
前兩個階段是打基礎(chǔ),第三階段是鍛煉在比賽中可以快速建立模型、想新算法
。這就要平時多做做綜合的題型了。
1. 把oibh上的論文看看(大概幾百篇的,我只看了一點點,呵呵)。
2. 平時掃掃zoj上的難題啦,別老做那些不用想的題.(中大acm的版主經(jīng)常說我挑簡單的來
做:-P )
3. 多參加網(wǎng)上的比賽,感受一下比賽的氣氛,評估自己的實力.
4. 一道題不要過了就算,問一下人,有更好的算法也打一下。
5. 做過的題要記好 :-)
(一)
不可能都完全記住那么多的算法.
常用算法,拿過來就可以寫出來
不常用的,拿起書來,看10分鐘,就能理解算法(因為以前記過).
對以前沒有記過的算法,就不好說了,難的可能要研究好幾天.
這樣就可以了.
應(yīng)該熟練掌握的常用的算法應(yīng)該有:
各種排序算法(插入排序、冒泡排序、選擇排序,快速排序,堆排序,歸并排序)
線性表(一般的線性表,棧,隊列)的插入和刪除
二叉樹的遍歷(前序,中序,后序)
圖的遍歷(深度優(yōu)先,廣度優(yōu)先)
二分法查找,排序二叉樹,Hash查找(處理沖突的方法)。
(二)
分析一個東西,你可以用不同的眼光去看待,有很多時候,就跟自己生活一樣,覺得小時候看待問題很幼稚,現(xiàn)在看問題全面了,而且方式不一樣了,為什么,就是成長吧,就跟這個一樣的,你對算法,比如寫一個程序,可能直接寫很簡單,可是可以有一些有趣的方式,比如通過什么樣來表達(dá),怎么樣更高效..等等吧
(三)
于大學(xué)里把基本的專業(yè)課學(xué)扎實就ok,如:數(shù)據(jù)結(jié)構(gòu),離散,操作系統(tǒng)等。碰到一些基本的數(shù)據(jù)結(jié)構(gòu)和算法,如查找排序要根據(jù)原理馬上能寫出相應(yīng)的代碼就行了,我個人是這樣理解的,對于更深層次的東西,也是建立在自己熟練的基礎(chǔ)之上的吧
(四)
算法與數(shù)據(jù)結(jié)構(gòu)考驗試題精析》第2版 機械工業(yè)出版社
如果你想練習(xí)的話,這里有N多的題可以來練習(xí),但實際中能用到的比較少,除非搞一些高端的玩意,不過平時也可以在自己的項目中結(jié)合使用
(五)
數(shù)據(jù)結(jié)構(gòu)在平時可能用不上,但數(shù)據(jù)結(jié)構(gòu)可以培養(yǎng)你程序時如果注意效率的意識,一個學(xué)過數(shù)據(jù)結(jié)構(gòu)的人和一個沒有學(xué)過數(shù)結(jié)構(gòu)的人寫出來的程序可能在效率上有差別。
(六)
搞ACM需要的掌握的算法.
要注意,ACM的競賽性強,因此自己應(yīng)該和自己的實際應(yīng)用聯(lián)系起來.
適合自己的才是好的,有的人不適合搞算法,喜歡系統(tǒng)架構(gòu),因此不要看到別人什么就眼紅,
發(fā)揮自己的長處,這才是重要的.
同時由于個人練習(xí)的時候可能有些偏向性,可能上面的總結(jié)不是很全,還請大家提出和指正,而且由于ACM的題目中專門針對某個算法的題目可能比較少出現(xiàn),所以上面的分類中的題有可能有多種解法或者是一些算法的綜合,這都不會影響大家做題,希望練習(xí)的同學(xué)能夠認(rèn)真,扎實地訓(xùn)練,做到真正的理解算法,掌握算法.同時在論壇上還有許多前輩的分類,總結(jié),大家也可以按自己的情況采用.注意FTP上有很多的資料,希望大家好好地利用.
如果同學(xué)能在明年暑假前能掌握上面大部分算法,那你也基本上達(dá)到了訓(xùn)練的目的,到暑假的時候你就可以選擇自己比較喜歡的方面進(jìn)行加深和強化,而且同學(xué)們不要覺得看算法的證明是很麻煩的事,這可以加強你的思維能力,這在ACM中也很重要.同時也希望老隊員能幫助我整理習(xí)題和題目分類.同時ACM的題目是沒有范圍的,只能在平時中多積累多練習(xí),多比別人多努力一點,你就會比別人多一線希望.
先掌握搜索,動態(tài)規(guī)劃,貪心這些思想方法
然后學(xué)習(xí)各種技巧