這個問題來自 Quora ,下面是 Brian Bi 的回覆,2200+ 贊,由嚴偉翻譯。
動態規劃(DP)似乎佔據了大部分的競賽題目(有估計說佔了三分之一)。當然,DP也不是一個學一次就Ok的單一演算法,所以,也許這並沒有回答你的問題。
我想這還取決於你是否把資料結構與演算法放在同一個等級中考慮。如果你想要在程式設計競賽中一展風采的話,當然,有些資料結構是你應該熟悉的。其中最重要的有範圍樹(Range Tree,也被稱為線段樹或區間樹)和樹狀陣列(BITs),也被稱作Fenwick樹。除此之外,許多DP演算法使用了一個字首和陣列(prefix sum array)。
我能想到的最精華的單一演算法如下所列,排名不分先後。然而,你可能會因為這其中的一些演算法在真正的競賽中很少出現而感到失望。絕大多數非動態規劃問題似乎都是各種ad hoc網路與資料結構,所以你只需要練習練習以熟練掌握它們。
(再一次宣告,我僅列出了滿足如下性質的演算法:有單一輸入集;計算輸入集的某個函式;不攜帶輸入值之間的狀態。這些性質將下面的演算法與資料結構區分開來。由定義,資料結構要保留狀態以及演算法的等級,還有像是DP這樣的演算法技術,它們並沒有前者所計算的某個具體函式。)
1.Eratosthenes篩法,或另一種素數篩法
2.深度優先搜尋
3.廣度優先搜尋
4.Dijkstra演算法
5.Floyd–Warshall 演算法
6.Either Kruskal演算法 或稱 Prim演算法
7.一些拓撲排序的實現,比如使用DFS
8.凸包(我推薦單調鏈演算法)
9.座標壓縮
10.Edmonds–Karp,或者Ford–Fulkerson方法的另一種實現;亦或預流推進演算法;又或者,如果你在準備ACM codebook,那麼就Dinic演算法。(注意:最大流不允許出現在國際資訊賽中,儘管如此,它也可能會出現在國家隊選拔賽中。)
其他回覆,可見 Quora 原帖。