看到好朋友zz的一個ACM總結,寫的非常好。。暫且轉載一下把。。。
ACM比賽對于選手的要求,很簡單,只有兩點:算法和程序實現。
當然一些隊友的配合以及良好的心態都是一些很隱性的因素,這里只說如何提高這兩塊。
算法方面:
第一,要不斷學習新算法,擴寬自己的知識面,不要怕難,不要怕麻煩,學習是在別人研究的基礎上,如果這點做不好,也很難在更深的層次發展;
第二,平時著重培養自己思考問題的能力,而不是拘泥在固有的算法和題目里,拿來一道題目,要有自己的一套思維習慣,從何入手,如何分析問題,思考的軌跡要很清晰的展開,這一點,是最核心的,也是最難的;
第三,模板一定要用自己理解后自己寫的,只是秉著一副“拿來主義”,很多自認為了解的東西也只是表層的;
第四,不要局限自己的思維,既有的東西雖好,但創新永遠是樂趣所在。
程序設計方面:
第一,養成良好的編程習慣,做好一件東西,首先要把他當做一種藝術,程序也是一種藝術,把自己的程序經營成可以欣賞的藝術;
第二,不要在思路不清晰的時候寫程序,理好思路,這也是設計的過程;
第三,不必使用一些高深的語法,多用類來封裝,適當的利用STL;
第四,寫的時候著重整體,檢查的時候注意細節。
寫的非常好,對自己是一種鼓勵!!
如果一個NPC問題存在偽多項式時間算法,那么稱其為Weakly NP-Complete。否則,稱為Strongly NP-Complete.
很明顯的一個例子是0-1背包問題,這一點經常容易引起別人的誤解。其實0-1背包問題是一個NPC問題,你可以簡單的把它規約到子集和問題,但是有人經常爭辯說0-1 kanpsack問題存在Polynomial Algorithm,那么問題就在這里,那個所謂的Polynomial Algorithm is Pseudo-Polynomial actually!
一個經典0-1背包問題的DP解法的時間復雜度是O(nW),W為背包容量,但是背包容量是否需要枚舉[min(…),\sum(…)]呢?所以問題就在這里了復雜度是O(n2^n)…
還有一個問題就是素性檢測!這個當然也是NPC的了。。
In the case of primality, it turns out there is a different algorithm for testing whether n is prime (discovered in 2002) which runs in time O(log6n).
如果仍然不是很清楚,那么需要熟悉一下NPC與P類問題區別,下面是一個不錯的表格。。。
不過貌似在源blog中有一處錯誤。。。Linear Programming的確是P問題,但是解決這個P問題的simplex 算法卻不是Polynomial的,這個需要注意!
http://brand.site.co.il/riddles/usingyourhead.html