深搜的剪枝技巧

2022-02-19 21:51:40 字數 1028 閱讀 5619

首先是深搜的模板:

int ans = 最壞情況, now;  //

now為當前答案

void

dfs(傳入數值)

}

1.剪枝的概念:

實際上,對於搜尋,其實就是一棵樹:

(樹醜,莫要介意)

那麼對於沒有剪枝的dfs,需要搜尋整棵樹,而剪枝,就是將其中一部分枝幹減掉,使時間複雜度降低。

2.剪枝的原則:三個原則:正確性(這是剪枝優化的前提),準確性,高效性;

3.深搜的優化技巧:

優化搜尋順序

排除等效冗雜

記憶化最優性剪枝

可行性剪枝

1.優化搜尋順序:不同的搜尋順序會產生不同的搜尋樹形態,其規模大小也相差甚遠

2.排除等效冗雜:在搜尋中,若我們發現沿某幾條線路所達到的效果是一樣的,那麼我們可以只搜尋其中的一條

3.記憶化:是啥?:

模板:

int g[maxn];  //

定義記憶化陣列

int ans =最壞情況, now;

void

dfs f(傳入數值)

}int

main()

4.最優性剪枝:在搜尋中導致執行慢的原因還有一種,就是在當前解已經比已有解差時仍然在搜尋,那麼我們只需要判斷一下當前解是否已經差於已有解。

模板:

int ans =最壞情況, now;

void

dfs(傳入數值)

}

5.可行性剪枝:

在搜尋中如果當前解已經不可用了還執行,也是在搜尋中導致執行慢的原因。

int ans =最壞情況, now;

void

dfs(傳入數值)

}

下面我們來看乙個簡單的剪枝的例題:【洛谷p1025】數的劃分

下面我們來看乙個超多剪枝的例題:【洛谷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 詳情見 ...