暑假ACM集训第一周总结

学习内容:bfs,dfs,贪心,剪枝
总结:
这是暑假集训的第一周,所以先总结下生活情况。暑假天气很热但教室有空调,食堂伙食也还行,每天训练时间很长但感觉过得也很充实.总之现在已经习惯了暑假集训的生活.
这一周训练内容是搜索(bfs,dfs)和贪心,训练方式是做题和自学.因为之前就学习过bfs和dfs,所以对bfs和dfs也有一定的了解,所以我也说说自己的理解.
这两种算法都是暴力搜索算法,搜索就是从由题目生成的所有答案中选出正确答案.而这两种搜索的方式却不大一样,如果把所有答案看成一张图的话,bfs是从第一个节点开始沿各个方向扩展其相邻的节点,然后再依次对相邻的节点进行扩展,直到找到正确答案或遍历完整张图结束(确实很暴力).而代码的实现也不难,主要通过队列实现,就是把第一个节点加入队列中,然后扩展相邻的节点把他们依次入队,扩展完之后把队首出队,这样就可以对下一个节点进行扩展,直到队列为空即所有节点都扩展完了或找到正确答案退出.因为bfs每扩展一次后的节点是上一个节点的步数+1,所以bfs经常用于寻找最短路径.
而dfs是从第一个节点开始只沿一个方向到一个相邻节点,这样遍历完所有节点(或者找到想到的节点)后返回上一个节点,然后沿其他方向再遍历,直至遍历完所有的路径.而代码是通过函数的递归来实现的,
要注意回溯.感觉很多题目都能用dfs搜出正解,不过时间复杂度过高.就比如找最短路径,dfs需要找出所有路径并选其中最短的,而bfs只需要第一次扩展到那个节点就结束.效率完全不同.因此盲目使用dfs可能会超时或因递归层数太多占用过多空间爆了.
这两种算法虽然很暴力,但可以通过剪枝优化时间复杂度,而有些剪枝有一定难度,灵活性高,目前掌握地不太好.
贪心是把问题分成若干个子问题然后依次选择最优解,最后合并成总问题的最优解,其前提是这个子问题的解不影响下一个问题也就是没有后效性.过程很简单但重点在于看出这个题到底能不能贪心…
然后下面是写题目的一些心得.BEJGJKL题都是一些简单的搜索,通过这些题加深了对搜索的熟悉度,
H题是数组模拟链表,不过紫书上的代码很精炼看来很久才看懂.O题bfs的剪枝很重要,比如不能减到负数,当前的步数不能超过记录的最小步数,当前数超过目标数时只能用减法等等.P题的剪枝是剩余没涂的颜色其中一个颜色的数量不能超过(剩余的格子数+1)/2,我开始都想不到导致超时.M题把所有不同状态的时间列举一遍求最优解,实现部分有点难,C题用dfs的思想生成子集暴力即可.F题是贪心+dfs,把坐标转换成边界以便判断,然后对上边界进行排序,让上边界高的排在前面,这利用了贪心的思想,因为上面的先涂色肯定能涂得更多,然后对每次涂色的颜色进行dfs.剩下4个没完成的题中A要用大数,D对输入的处理有点麻烦,I是对状态的bfs和建立图进行优化剪枝(完全不会),N题没看应该很难,有时间把这些题补上.
这周比赛只A了两道,以后有时间研究下题解.
目前不足之处是难的搜索题完全做不出,剪枝考虑不到位,还有待提高.

猜你喜欢

转载自www.cnblogs.com/megadeth/p/11297199.html