深搜前面已經講過,對於剪枝,就是把沒必要的步驟進行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 高效性 正確性,顧名思義就是不能把通向正確的路徑剪去。準確性,則是盡可能多的剪去不會通向正確...
深搜的剪枝技巧
概述 搜尋演算法的時間複雜度大多是指數級的,難以滿足對程式執行時間的限制要求,為使降低時間複雜度,對深度優先搜尋可以進行一種優化的基本方法 剪枝。搜尋的程序可以看做是從樹根出發,遍歷一顆倒置樹 搜尋樹 的過程,所謂剪枝,就是通過某些判斷,避免一些不必要的遍歷過程,形象的說,就是減去搜尋樹中的某些枝條...