版权声明:这是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++
好了,本次算法小课就到这里,谢谢大家的支持!