一、什么是DFS
1、一种在数和图上的搜索算法。
2.特点:按照特定的搜索方式搜索到最深处或目标后再逐级回溯。
二、DFS模板
1.栈版:
while(!s.empty)
{
type x=s.top;
s.pop();
xxx//具体搜索操作、一般会用到循环
{//设搜索到的下一个结点为y
s.push(y);
//搜索状态标记,比如更新visit数组
}
}
2.递归版:
while dfs(int x,int dep)
{
if(x == dep) return;//边界条件
xxx//具体搜索操作,一般会用到循环
{
xxx//搜索状态标记,比如更新visit数组
dfs(u + 1,dep);
xxx//状态还原,有时不需要这一步
}
}
三、例题
#include<iostream>
using namespace std;
int n,l,r,x;
int c[20];
int Max=0,Min=0,sum=0,num=0;
void dfs(int start)
{
for(int i=start;i<n;i++)
{
int this_sum = sum;
int this_min = Min;
int this_max = Max;
sum+=c[i];
Min=Min<c[i]&&Min!=0?Min:c[i];
Max=Max>c[i]?Max:c[i];
if(sum>=l&&sum<=r&&(Max-Min>=x))
num++;
if(i<n-1&&sum<r)
dfs(i+1);
sum = this_sum;
Min = this_min;
Max = this_max;
}
}
int main()
{
while(scanf("%d %d %d %d",&n,&l,&r,&x)!=EOF)
{
num=0;
for(int i=0;i<n;i++)
scanf("%d",&c[i]);
dfs(0);
printf("%d\n",num);
}
return 0;
}