菜鸟的ACM之路(6)北大MOOC算法基础笔记__第八、九周__深度优先搜索(DFS)

第八、九周

 

关于搜索,其实还是推荐《啊哈算法》这本书,这些方面讲的更易懂一点,读懂之后再看MOOC就轻松多了,个人感觉更重要的是剪枝的处理。

 

从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就称为深度优先搜索,简称深搜。其实称为“远度优先搜索”更容易理解些。因为这种策略能往前走一步就往前走一步,总是试图走得更远。所谓远近(或深度),就是以距离起点的步数来衡量的。

 

学会图的表示方法 -- 邻接表:

 

每个节点V对应一个一维数组(vector),里面存放从V连出去的边,边的信息包括另一顶点,还可能包含边权值等。

 

剪枝:可以从最优性剪枝和可行性剪枝入手考虑。

下面初步总结一个DFS的简单模板


// DFS模板
bool check()//参数根据题意书写,用于判断越界或者是不符合法状态
void dfs()  //参数根据题意书写,必要时void可更改为int等类型
            // 一般可以为(输入值,输出值,步数),元素可省略
{
    if(到达终点状态)
    {
        ...    //根据题意书写
        return;
    }
    
if(check())
        return;

剪枝;

for(扩展方式)
    {
        if(check(扩展方式))
        {
            ....  //根据题意书写
            标记;
            dfs();
            剪枝;
            (还原标记);  //回溯法加上还原标记
        }
        
    }
}


例题一览:
1.城堡问题 百练2815

2.踩方格 百练4982

3.Roads(寻路问题) 百练 1724

4.生日蛋糕 百练1190


例题大都是最经典的DFS例题,代码就不附了,生日蛋糕一例对思路有详尽的分析,摘抄一下


   要制作一个体积为M层生日蛋糕,每层都是一个圆柱体。设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时 ,要求Ri> Ri+1Hi > Hi+1 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。令Q = Sπ

请编程对给出的NM,找出蛋糕的制作方案(适当的RiHi的值),使S最小。(除Q外,以上所有数据皆为正整数)

解题思路:

深度优先搜索,枚举什么?

枚举每一层可能的高度和半径。

如何确定搜索范围?

底层蛋糕的最大可能半径和最大可能高度

搜索顺序,哪些地方体现搜索顺序?

从底层往上搭蛋糕,而不是从顶层往下搭

如何剪枝

剪枝1:搭建过程中发现已建好的面积已经超过目前求得的最优表面积,或者预见到搭完后面积一定会超过目前最优表面积,则停止搭建 (最优性剪枝)

剪枝2:搭建过程中预见到再往上搭,高度已经无法安排,或者半径已经无法安排,则停止搭建(可行性剪枝)

剪枝3:搭建过程中发现还没搭的那些层的体积,一定会超过还缺的体积,则停止搭建(可行性剪枝)

剪枝4:搭建过程中发现还没搭的那些层的体积,最大也到不了还缺的体积,则停止搭建(可行性剪枝)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值