第九天:poj1011(又是深度搜索+剪枝,还是不会o(∩_∩)o )

题目意思很简单:就是给你不同长度的木棍,然后让你去组合出N根长度相同的木棒,要你求N。
其实对于这种问题一开始我是拒绝的,但是,总要会吧,即使不会还是要硬着头皮上的额。

这次先再次讲dfs。这次举个比较形象的,别人用过的例子来说。

走迷宫!!!
走迷宫最简单想法是什么呢?就是上下左右去遍历,走过的地方标记,走到终点就退出。

但这不是我想要的额,我们要讲讲dfs的呢!!下面是伪代码。
void dfs()

if(当前的地方是终点)

输出路线;
return ;

if(左边不是墙)

当前位置变成墙;
向左边走一格;
记录路径;
dfs();
回到原来的地方(就是向右移动一格);
删除路径记录;

//上下右的方法一样;

但是知道这个有什么用呢?
这就是dfs的模版哦!!!!
内涵都在了。下面,总结一下:
首先判断一下,当前情况满不满足要求的最终目的,满足就return,
不满足就往下走,判断之后运行的状况,走一步,如果能走,就dfs(当前状态),最后得到结果。

对于这道题来说:重点却不再dfs,在于剪枝,之前讲过,剪枝就是在情况不满足的时候直接跳过,不满足的情况有,1、从长度不能整除你遍历的长度,直接剪,2、一旦有一根不满足你要的长度,那么就剪,3、在构建一根新的棒子组合的时候,要是第一根就没办法满足那么后面一定不行,所以剪。
剪枝能大大的提高dfs的效率。。。

dfs教会我的:我不保证我能一次就会,但是每一次尝试都是成功最好的证明,剪枝就是为了少走弯路能更快的到达成功的地方。
我不保证我dfs一次能学会,但是我会递归的去尝试用它o(∩_∩)o 。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值