演算法 回溯演算法套路模板

2022-07-21 04:30:17 字數 1092 閱讀 6307

回溯演算法應用

經典的全排列和n皇后

怎麼窮舉全排列的呢?比方說給三個不重複數 [1,2,3],你肯定不會無規律地亂窮舉,一般是這樣:

先固定第一位為 1,然後第二位可以是 2,那麼第三位只能是 3;然後可以把第二位變成 3,第三位就只能是 2 了;然後就只能變化第一位,變成 2,然後再窮舉後兩位……

其實這就是回溯演算法,只要從根遍歷這棵樹,記錄路徑上的數字,其實就是所有的全排列。我們不妨把這棵樹稱為回溯演算法的「決策樹」

為啥說這是決策樹呢,因為你在每個節點上其實都在做決策,比如當前在樹的第二層深度,站在數字2的位置做決策,可以選擇 1 那條樹枝,也可以選擇 3 那條樹枝。為啥只能在 1 和 3 之中選擇呢?因為 2 這個樹枝在你身後,這個選擇你之前做過了,而全排列是不允許重複使用數字的

「路徑」,記錄你已經做過的選擇;

「選擇列表」就是[1,3],表示你當前可以做出的選擇;可以通過狀態陣列來維護每乙個深度下的狀態

「結束條件」就是遍歷到樹的底層(或者判斷所有的數都進入了路徑中)

盜圖顯示(多謝原作者):

**塊:

///

/// 回溯法 遞迴 樹形結構

/// 每次做選擇,遞迴,然後回溯到上一層修改選擇,滿足條件後新增到結果列表(注意這裡不同語法可能需要拷貝操作)

/// 其全排列的形成靠的是遞迴函式遍歷到對應深度層, 另外的排列可能性在於回溯原來的狀態以新的值作為遞迴的根

///

///

///

///

public ilist> permute(int nums)

///

/// 使用狀態標記,空間換時間

///

///

///

///

public void backtrack_state(int nums, bool marked, listpath, ilist> ans)

for (int i = 0; i < nums.length; i++)

}

演算法 回溯演算法套路(dfs)

解決乙個回溯問題,本質是乙個決策樹的遍歷 三要素 1.路徑 已經做出的選擇 2.選擇列表 當前可以做的選擇 3.結束條件 到達決策樹底層,不用再做選擇 演算法框架 result def backtrack path,choicelist if 滿足結束條件 result.push back path...

回溯演算法套路 去重總結

回溯演算法模板 public void func int nums,list l,int start 這裡i的開頭如果從0開始是涉及到排列問題,如果是子集問題則需要從start開始 for int i 0 i nums.length i l.add nums i func nums,l,i l.re...

演算法 回溯法 模板解法

回溯法問題 實際上就是乙個決策樹的遍歷過程 分為三步 路徑 已做出選擇的路徑。選擇列表 當前可以做的選擇 結束條件 就是到達決策樹的底層,無法再做出選擇的條件。退出條件 template class t vector res 回溯法的 框架 dfs btrack 路徑,選擇列表 for 選擇 選擇列...