算法2——浅谈DFS剪枝技巧及其应用

版权声明:这是ZYF老师的劳动成果,希望能得到你们的支持,转载请链接,谢谢配合! https://blog.csdn.net/qq_41332995/article/details/86678778

一段声明:下周有点事,这周先补回来,抱歉。(可是我为什么要抱歉?)

上一篇我们讲述了DFS算法及其应用,这周我们来讲DFS的剪枝技巧。

何为剪枝,让我们来学习一下:

剪枝:通过某种判断,避免一些不必要的遍历过程(正规地说)剪去搜索树中的某些枝条(形象地说)

那么有人会问,我能不能什么都剪呢?那样我能过掉所有的题了!

可是现实是残酷的,剪枝也有原则。

剪枝的原则:(高能重点警告)

原则一:正确性

如果我们把我们需要的解也剪掉了,那么剪枝优化也失去了意义。我们要在保证正确性的基础上进行剪枝。

原则二:准确性

保证正确性的基础上,尽可能的多剪掉不能通向正解的枝条。

原则三:高效性

提高判断本身的时间效率,改善时间复杂度。

六个字:正确,精准,高效

举一个简单的例子:

DFS优化技巧:

一、优化搜索顺序

有时不同的顺序带来的时间复杂度是不一样的,比如想找最大值可以从最大的往前搜(判断是否合法)

二、排除等效冗余

有时不同分支的遍历最终是相同的,可以省略(条条大路通罗马)

三、可行性剪枝

有时如果走不下去了,可以剪枝

四、最优性剪枝

有时如果走下去没有意义了,可以剪枝

五、记忆化:(绝大部分可以变成DP)

可以记录每个状态的搜索结果,如果重复便返回

例题:https://vjudge.net/problem/UVA-1374

剪枝:

if(now<<(maxd-cur)<n || cur>maxd || now<0) return false;
if(now==n || now<<(maxd-cur)==n)  return true;

注:博主已转C++

好了,本次算法小课就到这里,谢谢大家的支持!

猜你喜欢

转载自blog.csdn.net/qq_41332995/article/details/86678778