深度優先搜尋,俗稱深搜,即dfs,是乙個常用並且基礎的演算法和思想。但是搜尋演算法的時間複雜度往往很大,是oi不被允許的。所以對於深搜的優化最實用和基礎的乙個方法就是剪枝。
三原則:1、正確性;2、準確性;3、高效性;
正確性,顧名思義就是不能把通向正確的路徑剪去。
準確性,則是盡可能多的剪去不會通向正確的路徑,也就是判斷條件更嚴格。
高效性,簡單來說就是判斷操作更更高效才行。
這就帶來乙個矛盾,就是判斷條件的嚴格度和判斷操作的效率的平衡。不過一般來講,我們更注重判斷條件的嚴格度之後再考慮優化判斷操作(預處理什麼的)。
剪枝技巧:
1、優化搜尋順序;
2、排除等效冗餘;(即如果在遞迴樹上有兩個節點的狀態一模一樣,只不過走過的路不一樣,那麼在有些題目中可以只搜尋一條)
3、可行性剪枝(上下界剪枝);在做可行性剪枝的時候我們設計的剪枝方案要「看的遠",及時檢查當時狀態看是否可以達到遞迴條件。
4、最優性剪枝;當前花費加上預期的最小花費已經劣於搜尋到的答案,直接返回。
5、記憶化;
深搜的剪枝
深搜前面已經講過,對於剪枝,就是把沒必要的步驟進行if特判剪枝,用好了可以大大的優化複雜度 這裡就根據兩個例題來講吧 詳情見 include include include intn,k int f 210 7 int main printf d n f n k 輸出最大值 return0 詳情見 ...
深搜優化剪枝
之前做過不少深搜題,很多tle,所以剪枝很重要,如何 未雨綢繆 避免不必要的搜尋樹分支?例題 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸出乙個整數,即不同的分法。由題意...
深搜剪枝 小木棍
時間限制 1 sec 記憶體限制 128 mb 提交 7 解決 5 提交 狀態 討論版 命題人 add cy 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設...