(1) P1118 数字三角形——暴力dfs->找规律+剪枝
https://blog.csdn.net/qq_35299223/article/details/102897256
这题的加速主要是求和的过程使用了杨辉三角进行加速,但是除了这一处的加速之外,还有一个就是增加了dfs最大最小值dfs剪枝。
(2) P1433 吃奶酪——求最大最小值常用的dfs剪枝方法
https://blog.csdn.net/qq_35299223/article/details/102930778
上面提到的 常用的最大最小值dfs剪枝,实际上就是在dfs的过程中添加一个参数,计算当前的值是否已经超过目前的得到的最大值或者最小值,如果已经超过了,那么就进行剪枝,这是一个常用的剪枝技巧。
(3) P1434 [SHOI2002]滑雪——记搜经典例题
https://blog.csdn.net/qq_35299223/article/details/102911934
本题是一个记忆化搜索的模板题,总结的模板如下。注意就是在返回条件上加上一个当前搜索的值是否已经存在,存在就返回。每次搜索的时候要去记录下这个结果。
//记忆化搜索框架
int mark[maxsize][maxsize];
int dfs(int row,int col){
if(mark[row][col]){
//如果搜索的点已经被填充过;
return;//直接返回
}
int res;//初始化一个值,也可以直接将mark[row][col]初始化为一个值,然后对mark[row][col]进行更新
for(遍历周围的点){
if(满足深搜的条件){
int val=dfs(更深一层);
res= res.....val....;//根据题目关系,对res和更深一层搜索结果的返回值做一个处理,更新res
}
}
//搜索完之后一定要将结果记录在mark[][]上!
mark[row][col]=res;
return mark[row][col];//最终返回结果为当前的mark[row][col]的值
}
(4) P1074 靶形数独——有优先顺序的dfs
https://blog.csdn.net/qq_35299223/article/details/102956881
本题是一个有优先次序的dfs,其本质为先根据权重大概确定一个搜索的路径,然后按照该路径搜索,这样可以减少搜索的时间。
(5) P1126 机器人搬重物———类dijkstra搜索,路径搜索去重
https://blog.csdn.net/qq_35299223/article/details/102837085
这题是一个类似于最短路径的问题。搜索其实一直有一个关键问题就是如何防止重复搜索。
解决这个问题的方法一个是标记+回溯,搜索过程中不去搜索已经标记了的点。
另外一个就是只对有价值继续搜索的点进行搜索。 本题中就是搜到重复的点,如果这个点可以更新当前点的状态,那么我们可以继续去搜索它。如果不能更新状态,那么我们就不去进行后续的搜索。 这个其实和dijkstra算法的最短路径搜索有些类似。但是总体来说,尽量避免大量的记录路径,除非题目要求枚举全排列。