DFS

DFS及剪枝技巧

一、DFS的基本思想

深度优先搜索的基本思想是:

       为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一且发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解

 

 

二、DFS算法框架

框架一

int dfs(int k)
{
    for(int i=1;i<=算符种数;i++)
      if(满足条件)
      {
          保存结果;
        if(到目的地) 输出解;
        else dfs(k+1);
        恢复:保存结果之前的状态 {回溯一步}; 
       } 
}

 

框架二

int dfs(int k)
{
    if(到目的地) 输出解;
    else
      for(int i=1;i<=算符种数;i++)
        if(满足条件)
        {
             保存结果;
           dfs(k+1);
           恢复:保存结果之前的状态 {回溯一步}; 
        } 
}

 

 

三、什么是剪枝

       搜索的进程可以看作是从树根出发,遍历一棵倒置的树一搜索树的过程,而所谓剪枝,顾名思义,就是通过某种判断,避免一些不必要的遍历过程,形象地说,就是剪去搜索树中的某些“枝条”,故称剪枝

 

 

四、剪枝的原则

1.正确性

2.准确性

3.高效性

 

 

 五、深度优先搜索的优化技巧
 
1.优化搜索顺序
      在一些搜索问题中,搜索树的各个层次,各个分支之间的顺序不是固定的,不同的搜索顺序会产生不同的搜索树形态,其规模大小也相差甚远
 
2.排除等效冗余
      在搜索过程中,如果我们能够判定从搜索树的当前节点上沿着某几条不同分支到达的子树是等效的,那么只需要对其中的一条分支执行搜索
 
3.可行性剪枝
      在搜索过程中,及时对当前状态进行检查,如果发现分支已经无法到达递归边界,就执行回
溯,这就好比我们在道路上行走时,远远看到前方是一个死胡同就应该立即折返绕路,而不是走
到路的尽头再返回
      某些题目条件的范围限制是一个区间,此时可行性剪枝也被称为“上下界剪枝”。
 
4.最优性剪枝
       在最优化问题的搜索过程中,如果当前花费的代价已经超过当前搜到的最优解,那么无论采
取多么优秀的策略到达递归边界,都不可能更新答案。此时可以停止对当前分支的搜索,执行
回溯

5.记忆化
        可以记录每个状态的搜索结果,在重复遍历一个状态时直接检索并返回,这好比我们对图进
行深度优先遍历时,标记一个节点是否已经被访问过

 

六、例题

1. 1440:【例题1】数的划分

2. 1441:【例题2】生日蛋糕

3. 1442:【例题3】小木棍

4. 1443:【例题4】Addition Chains

 

posted @ 2019-06-09 20:56  晔子  阅读(331)  评论(0编辑  收藏  举报