DFS优化

DFS是常用的暴力方法,但由于其O(n!)的效率,有时难以通过较多数据点,所以需对其进行剪枝。


范围剪枝:

(一种可行性剪枝,拉出来单独讲)
有时DFS的范围较大会导致TLE,这时需根据题意缩小搜索的范围。例如:需要搜索一个n位数,但需要其低位数字保证比高位数字大。例如12345是合法的,但12354是不合法的。
比较差的思想是先做一遍全排列,如果已经做完一遍,再判断这个排列是否满足条件。
优化:每层dfs记录上一层已经使用的最大数字,从这个数字+1开始枚举数字即可。


最优化剪枝:

有时需要求一个最优化方案(最大啊,最小啊),这个时候如果求出所有方案,一一判断是否最优,这种方案是很差的。
所以,我们可以在DFS中间加入最优化判断:如果目前的方案已经比之前求出方案差了,那么直接return,抛弃这种方案。
如果这种剪枝与一种尽量让方案更早获得最优解的操作结合,将会更快输出结果。


记忆化搜索:

采用动态规划思想,将DFS的中间值保存,就可以不再重复计算。
例如递归求一个斐波那契数列,如果直接求解,F(n)的结果会计算多次,但如果保存了F(n)的结果,则可以保证每个F(n)只计算一次,不会发生爆时间的惨剧。(斐波那契数列只是递归ÿ

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值