首先是深搜的模板:
int ans = 最壞情況, now; //1.剪枝的概念:now為當前答案
void
dfs(傳入數值)
}
實際上,對於搜尋,其實就是一棵樹:
(樹醜,莫要介意)
那麼對於沒有剪枝的dfs,需要搜尋整棵樹,而剪枝,就是將其中一部分枝幹減掉,使時間複雜度降低。
2.剪枝的原則:三個原則:正確性(這是剪枝優化的前提),準確性,高效性;
3.深搜的優化技巧:
優化搜尋順序
排除等效冗雜
記憶化最優性剪枝
可行性剪枝
1.優化搜尋順序:不同的搜尋順序會產生不同的搜尋樹形態,其規模大小也相差甚遠
2.排除等效冗雜:在搜尋中,若我們發現沿某幾條線路所達到的效果是一樣的,那麼我們可以只搜尋其中的一條
3.記憶化:是啥?:
模板:
int g[maxn]; //4.最優性剪枝:在搜尋中導致執行慢的原因還有一種,就是在當前解已經比已有解差時仍然在搜尋,那麼我們只需要判斷一下當前解是否已經差於已有解。定義記憶化陣列
int ans =最壞情況, now;
void
dfs f(傳入數值)
}int
main()
模板:
int ans =最壞情況, now;5.可行性剪枝:void
dfs(傳入數值)
}
在搜尋中如果當前解已經不可用了還執行,也是在搜尋中導致執行慢的原因。
int ans =最壞情況, now;下面我們來看乙個簡單的剪枝的例題:【洛谷p1025】數的劃分void
dfs(傳入數值)
}
下面我們來看乙個超多剪枝的例題:【洛谷uva307】小木棍sticks
深搜的剪枝技巧
概述 搜尋演算法的時間複雜度大多是指數級的,難以滿足對程式執行時間的限制要求,為使降低時間複雜度,對深度優先搜尋可以進行一種優化的基本方法 剪枝。搜尋的程序可以看做是從樹根出發,遍歷一顆倒置樹 搜尋樹 的過程,所謂剪枝,就是通過某些判斷,避免一些不必要的遍歷過程,形象的說,就是減去搜尋樹中的某些枝條...
深搜的剪枝技巧 小木棍
時間限制 1 sec 記憶體限制 128 mb 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。輸入檔案共有二行。第一行為乙...
深搜的剪枝
深搜前面已經講過,對於剪枝,就是把沒必要的步驟進行if特判剪枝,用好了可以大大的優化複雜度 這裡就根據兩個例題來講吧 詳情見 include include include intn,k int f 210 7 int main printf d n f n k 輸出最大值 return0 詳情見 ...