切莫相信动规,吾将为您指明前进之路
印子
比赛时,你是否有这样的经历:不敢用for暴搜,又不会用数学公式推理;焦急地在纸上打草,却没有优化思路;明明比赛前一天晚上背了那么多模板却脑子一片空白……我想,你应该很绝望吧
嘿,DFS来辣!
简介
DFS(深度优先搜索(Depth First Search),爱称为示范性快速搜索(Demonstration Fast Search)或大法师),是一种能够将所有可能情况全都遍历一遍的算法
进一步了解
相比于for暴搜,他多了一些成熟与稳重,愿意在赛场上助你一臂之力
作为搜索算法,他的原理是通过将大问题分解为众多子问题,他的基础是函数递归
著名的金牌教练刘曾这么说
“DFS是初学者学习暴力法的第一个障碍,学习时间断则数天,长则数月甚至一年以上”
对于众多初学者来说,为什么不能快速理解DFS?那是因为函数的递归与回溯确实比较难理解,但当你对其理解透彻时,你将会觉得DFS是如此美妙
模板
void dfs(...){
if(i==n) { ...return; }
for(int j=1;j<=n;j++) if(!vis[j]) vis[j]=1,dfs(...),vis[j]=0;//回溯
}
在打DFS时一般都会用这个模板,不过不能拘泥于这一种形态
例题
最经典的DFS题,莫过于八皇后问题和全排列问题
若读者对DFS感兴趣的话,一定要试试这两道题,当彻底地理解这道题后,你就已经迈进了DFS的门槛
题外
DFS的一个重要帮手就是记忆化搜索——一个可以帮助DFS比肩动态规划的优化方法
如何打记忆化搜索呢?首先,要将void类型的dfs转成有返回值类型的函数,然后在将每一次的返回值存到数组中,若这层已经被搜过,就直接返回结果,可以大大提高运行效率,由于其便于使用,又效率高,笔者十分推荐
DFS的赞歌
若您感到迷茫,请不要慌张,请不要害怕
因为DFS将为您拨开迷雾,指引您前进
就算荆棘遍地,DFS也能为您横扫一切
无所畏惧,众生平等!
我DFS教虔诚的信徒们啊,切莫相信动规,我DFS将为您指明前进的道路!!
我DFS永垂不朽!!!!!!!