《挑戰程式設計競賽》 演算法初級篇

2022-07-14 22:21:27 字數 1155 閱讀 4656

本系列為《挑戰程式設計競賽》讀書筆記,分為初級篇、中級篇、高階篇

初級篇目錄:

窮竭搜尋

貪心

動態規劃

資料結構

圖論

數論

特殊狀態列舉:可行解空間多數可採用dfs,但當其比較特殊時,可簡短地實現:

棧記憶體與堆記憶體:(所以一般演算法競賽中都使用全域性陣列,開的最大

main函式中的區域性變數儲存在棧記憶體中,統一分配後不再擴大,影響棧深度,與機器設定有關。通常,c++中執行上萬次遞迴是可行的。

new或malloc的分配的是堆記憶體,全域性變數儲存在堆記憶體中,使用全域性變數代替區域性變數可減少棧溢位的風險。

/*

* aoj 0558: cheese

* 題意:m*n矩陣內,給出起點、1~n表示n個工廠、障礙、空格。求按順序遍1~n的最短路。

* 型別:bfs+queue(/dijkstra)

* 演算法:從s順序通過1~n的最短路,可以用bfs求n次相鄰序號間最短路的和。 */

/**

* 要求順序遍1~n的最短路徑,可以每次用bfs求出相鄰兩點的最短路,然後加起來

* 因為bfs每次都是直接遍歷所有周圍的點,所以搜到終點時,d[x][y]表示的一定是直接走最短的路;

*/貪心就是遵循某種規律,不斷貪心選取當前最優策略

動態規劃(dp):通過定義某種最優子狀態,進行狀態間轉移達到最終解。

記憶化搜尋:將重複狀態通過標記降低複雜度。

多種形式的dp:搜尋的記憶化或利用遞推關係的dp,或從狀態轉移考慮的dp。狀態定義和迴圈順序都會影響複雜度。

使用memset初始化

重複迴圈陣列

dp僅bool是一種浪費

根據規模改變dp物件

揹包問題(01揹包,完全揹包)

最長子序列(lcs,lis)

劃分數型別:就是n的m劃分(第二類stirling數,bell數):

面試題中的比例:

挑戰程式設計競賽筆記 準備篇和窮舉

1.1 oj結果 accepted 通過用例 time limit exceed 超時 runtime error 程式非法訪問記憶體或未處理異常 memory limit exceeded 記憶體超限 presentation error 輸出的內容對的,但是格式不符合 output limit ...

挑戰程式設計競賽(3)

給定整數a1,a2,an,判斷是否可以從中選出若干數,使他們的和恰好為k。1 n 20 1e8 ai 1e8 1e8 k 1e8 樣例1input 4 1 2 4 7 13 output yes 13 2 4 7 樣例2input 4 1 2 4 7 15 output no dfs include...

挑戰程式設計競賽 樹

二叉樹的表達 樹的遍歷 從根r到結點x的路徑長度為x的深度 depth 結點x到葉結點的最大路徑長度成為結點x的高。請編寫乙個程式,輸出給定有根樹t中各節點u的資訊。採用 左子右兄弟表示法 1 結點u的父節點 2 結點u最左側的子結點 3 結點u右側緊鄰的兄弟結點 引用u.parent即可知道結點u...