本系列為《挑戰程式設計競賽》讀書筆記,分為初級篇、中級篇、高階篇
初級篇目錄:
窮竭搜尋
貪心
動態規劃
資料結構
圖論
數論
特殊狀態列舉:可行解空間多數可採用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...