第五周ACM博客总结

这一周自己主要看的是搜索和思维的内容,大概详细看了八道DFS和BFS的相关题目,又粗看了十几道相关的题目,因为现在基础可能优点薄弱,一道题的代码得看好久才能明白一点,所以看的题目可能少了一些,但是通过这几道题,自己也发现了一些共性的思路和方法。除了这些题目外,自己也看了大概十几篇搜索和思维的相关博客,加深对知识的理解,虽然看的可能多了点,但是很多还是看不懂。同时自己也重新巩固 了一些线性表的相关内容。这一周主要是自己研究的那八道DFS和BFS的题目,这八道题自己研究的相对透彻一点点,以下是这一周的详细总结内容。

DFS主要是用递归实现的,是枚举完所有完整路径遍历所有的情况的方法,一条路走到头。大概的题型主要有背包的部分问题,给定序列列举所有子序列的相关问题,迷宫可行路径数以及指定步数的迷宫类问题。重点是要解决遇到岔道口和死胡同的问题,如果可以的话,也可以通过剪枝来优化代码。一般在主函数中,都会有DFS(0,0,0)这一类的代码,不断的进行递归,需要注意return的时机,return的位置放错了,或者没有写,程序就崩掉了。

BFS主要使用队列来实现,用到了STL中的queue容器,按层次的顺序进行遍历。大概的题型主要有矩阵块个数的相关问题,也有迷宫类求到达指定点最少步数的相关问题,数字操作相关问题,以及象棋的相关问题。大概这类问题的基本模板就是定义queue容器,往里边加入元素,如果容器不为空,取出队首元素,访问队首元素,将队首元素出队,将对首的下一层节点中未曾入队的结点全部入队,并设置为已入队,循环这个过程,只要容器不为空就继续循环。

自己看的DFS第一道题是选择物品使得价值最大,并且不能超过背包容量的问题,第一遍自己按照代码仔细的理解了一番,模仿着代码的思路来写,然后又自己动手把它打出来再理解一番。大体思路就是要确定好递归函数的参数,遇到岔道口和死胡同要注意哪些量能变,哪些量不能变,达到条件后返回。如果能加入一个判断条件,只有没有超过容量时,才进入岔道口进行递归的话,可以优化代码效率,减少时间复杂度。第二道题是从n个数中选k个数,求解最优方案,思路差不多的,需要建立数组来存放最优方案,需要注意的是,将相应方案放入数组,当分支结束时,一定要从数组中取出,不能影响另一个分支的判断,其余的写好递归函数就可以了。另外两个题目是迷宫类问题,大体思路一致,自己遇到的问题就是不知道啥时候return,以及递归的时机,自己动手打了几遍之后,大体明白了啥时候递归,需要不断理清整个过程,才能做出准确的判断。以后自己也会不断的加深理解,一步步的吃透它。

自己看的BFS第一道题是求矩阵中的块,这类问题都会建立一个增量数组来模拟上下左右四个位置,而且都要定义bool函数,判断点的有效性,这一点判断好非常重要,要判断点是否已经入过队了,标记好符合条件的点,按照模板,只要队列不为空,一步步的循环得出结果就可以了。第二个是一个迷宫类的问题,自己第一遍还是先明白思路,然后再动手自己打一遍,再进行进一步的理解。这道题的关键在于检测位置的有效性,越过边界或者碰到墙壁,都要返回false,也要注意定义bool函数判断点是否已经入过队,这一点应该对很多题目都是相通的。另外两个是数字操作类和迷宫类的问题。好像迷宫类的题目挺重要的,在DFS和BFS中都有这种题型,基本的思路和自己遇到的问题也都和上面两道题差不多的,题目看多了就会发现有很多共性的思路和自己容易犯的错误,基本都是要判断好边界条件以及判断条件等。

线性表有顺序存储和链式存储。顺序存储占用一片连续的内存空间,知道了某个元素的存储位置就可以计算其它元素的存储位置。线性表顺序存储结构是依次存储的,地址连续,中间没有空出存储单元。顺序表的优点就是以物理位置相邻表示逻辑关系,任何一个元素都能随机存取。顺序表所有元素的存储位置均可由第一个数据元素的存储位置得到,类似于一个等差数列。线性表的内容还没巩固完,这是目前已有的一些线性表知识总结。

还有这周的codeforce比赛,自己想在这里一块总结了,因为自己可能最近学算法学的有点困难,导致简单的题目,自己也会不由自主的往算法上想,最终自己简单的题目也做不出来,再加上题目是英文的,有点不适应,最终对题目没有准确的思路。所以整体下来,自己也明白自己是个什么水平了,离真正的参加比赛的水平还差很远很远。自己以后会耐心的把题目读完,并且先理清思路,沉下心来,想想是不是需要用到相关算法知识,再去动手去实现代码。

对于DFS和BFS这两类题目,自己动手打代码的时候遇到的最大问题就是条件不知道怎么设置,定义参数不知道定义几个,以及整个流程下来,一些细节判断,如果正确处理结点等问题,自己目前对这些操作非常不熟悉,真正把思路转换成代码时,发现也是一个很大的挑战,很多时候都是处于无从下手的状态,不知该如何去写。下一周自己也会继续每天看博客,做题目,多看看他们是怎么写出来的,再不断的去学习模仿,与此同时,自己也会通过其它渠道来进一步巩固算法知识,相信就会有很大的收获。下周继续坚持学习!

最后把BFS的思路模板写在这里,以后就直接按照这个思路来写代码:

void BFS(int s) {

queue<int>q;

q.push(s);

while( !q.empty( ) ) {

取出队首元素top;

访问队首元素top;

将队首元素出队;

将top的下一层结点中未曾入队的结点全部入队,并设置为已经入队;

      }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗紫色的乔松(-_^)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值