DFS是常用的暴力方法,但由于其O(n!)的效率,有时难以通过较多数据点,所以需对其进行剪枝。
范围剪枝:
(一种可行性剪枝,拉出来单独讲)
有时DFS的范围较大会导致TLE,这时需根据题意缩小搜索的范围。例如:需要搜索一个n位数,但需要其低位数字保证比高位数字大。例如12345是合法的,但12354是不合法的。
比较差的思想是先做一遍全排列,如果已经做完一遍,再判断这个排列是否满足条件。
优化:每层dfs记录上一层已经使用的最大数字,从这个数字+1开始枚举数字即可。
最优化剪枝:
有时需要求一个最优化方案(最大啊,最小啊),这个时候如果求出所有方案,一一判断是否最优,这种方案是很差的。
所以,我们可以在DFS中间加入最优化判断:如果目前的方案已经比之前求出方案差了,那么直接return,抛弃这种方案。
如果这种剪枝与一种尽量让方案更早获得最优解的操作结合,将会更快输出结果。
记忆化搜索:
采用动态规划思想,将DFS的中间值保存,就可以不再重复计算。
例如递归求一个斐波那契数列,如果直接求解,F(n)的结果会计算多次,但如果保存了F(n)的结果,则可以保证每个F(n)只计算一次,不会发生爆时间的惨剧。(斐波那契数列只是递归ÿ