第八、九周
关于搜索,其实还是推荐《啊哈算法》这本书,这些方面讲的更易懂一点,读懂之后再看MOOC就轻松多了,个人感觉更重要的是剪枝的处理。
从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”。其实称为“远度优先搜索”更容易理解些。因为这种策略能往前走一步就往前走一步,总是试图走得更远。所谓远近(或深度),就是以距离起点的步数来衡量的。
学会图的表示方法 -- 邻接表:
每个节点V对应一个一维数组(vector),里面存放从V连出去的边,边的信息包括另一顶点,还可能包含边权值等。
// DFS模板
bool check()//参数根据题意书写,用于判断越界或者是不符合法状态
void dfs() //参数根据题意书写,必要时void可更改为int等类型
// 一般可以为(输入值,输出值,步数),元素可省略
{
if(到达终点状态)
{
... //根据题意书写
return;
}
if(check())
return;
剪枝;
for(扩展方式)
{
if(check(扩展方式))
{
.... //根据题意书写
标记;
dfs();
剪枝;
(还原标记); //回溯法加上还原标记
}
}
}
2.踩方格 百练4982
3.Roads(寻路问题) 百练 1724
4.生日蛋糕 百练1190
请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。(除Q外,以上所有数据皆为正整数)
解题思路:
深度优先搜索,枚举什么?
枚举每一层可能的高度和半径。
如何确定搜索范围?
底层蛋糕的最大可能半径和最大可能高度
搜索顺序,哪些地方体现搜索顺序?
从底层往上搭蛋糕,而不是从顶层往下搭
如何剪枝
剪枝1:搭建过程中发现已建好的面积已经超过目前求得的最优表面积,或者预见到搭完后面积一定会超过目前最优表面积,则停止搭建 (最优性剪枝)
剪枝2:搭建过程中预见到再往上搭,高度已经无法安排,或者半径已经无法安排,则停止搭建(可行性剪枝)
剪枝3:搭建过程中发现还没搭的那些层的体积,一定会超过还缺的体积,则停止搭建(可行性剪枝)
剪枝4:搭建过程中发现还没搭的那些层的体积,最大也到不了还缺的体积,则停止搭建(可行性剪枝)