深搜的剪枝

2022-04-12 01:27:12 字數 1399 閱讀 3389

深搜前面已經講過,對於剪枝,就是把沒必要的步驟進行if特判剪枝,用好了可以大大的優化複雜度

這裡就根據兩個例題來講吧

詳情見**

#include#include

#include

intn,k;

int f[210][7

];int

main()

printf(

"%d\n

",f[n][k]);//

輸出最大值

return0;

}

詳情見**

include#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=0x3f3f3f3f

;const

int minn=-0x3f3f3f3f

;int n,m,ans,a[10086],b[10086

];inline

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *f;}/*

體積v=πr2h

側面積a=2πrh

底面積a=πr2

*/void dfs(int v/*

已用體積

*/,int s/*

表面積*/,int p/*

剩餘層數 注意是剩餘

*/,int r/*

半徑*/,int h/*高*/

) if(v+b[p-1]>n)

return ;//

如果已用體積加上這層的最大體積大於了n那還蒐個屁!

if(s+a[p-1]>ans)

return

;

if(2*(n-v)/r+s>=ans)

return; //

當前的表面積+餘下的側面積》當前最優值那還蒐個屁!

for(int i=r-1; i>=p; i--)

}int

main()

dfs(

0,0,m,n+1,n+1);//

進行搜尋

//5個量的意思看上

if(ans==maxn)

cout

<<0

;

else

cout

}

深搜優化剪枝

之前做過不少深搜題,很多tle,所以剪枝很重要,如何 未雨綢繆 避免不必要的搜尋樹分支?例題 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸出乙個整數,即不同的分法。由題意...

深搜剪枝小結

深度優先搜尋,俗稱深搜,即dfs,是乙個常用並且基礎的演算法和思想。但是搜尋演算法的時間複雜度往往很大,是oi不被允許的。所以對於深搜的優化最實用和基礎的乙個方法就是剪枝。三原則 1 正確性 2 準確性 3 高效性 正確性,顧名思義就是不能把通向正確的路徑剪去。準確性,則是盡可能多的剪去不會通向正確...

深搜的剪枝技巧

概述 搜尋演算法的時間複雜度大多是指數級的,難以滿足對程式執行時間的限制要求,為使降低時間複雜度,對深度優先搜尋可以進行一種優化的基本方法 剪枝。搜尋的程序可以看做是從樹根出發,遍歷一顆倒置樹 搜尋樹 的過程,所謂剪枝,就是通過某些判斷,避免一些不必要的遍歷過程,形象的說,就是減去搜尋樹中的某些枝條...