目录
一:这周看的资料:
目前下面这41个题目都读了一遍,ac7题,截至周日晚,没有完成50题的既定目标。
- [NOIP2002 普及组] 选数 - 洛谷
- [USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins - 洛谷
- 求细胞数量 - 洛谷
- 海战 - 洛谷
- [USACO10OCT]Lake Counting S - 洛谷
- [NOIP2001 普及组] 求先序排列 - 洛谷
- [COCI2019-2020#1] Lutrija - 洛谷
- 南蛮图腾 - 洛谷
- [USACO10MAR] The Rock Game S - 洛谷
- 拯救oibh总部 - 洛谷
- 「JYLOI Round 1」箭头调度 - 洛谷
- 全排列问题 - 洛谷
- 取数游戏 - 洛谷
- [USACO06DEC]Cow Picnic S - 洛谷
- 最大食物链计数 - 洛谷
- [NOIP2017 提高组] 奶酪 - 洛谷
- [USACO06OCT] Cows on Skates G - 洛谷
- 奇怪的电梯 - 洛谷
- [USACO1.5]八皇后 Checker Challenge - 洛谷
- [USACO08JAN]Cow Contest S - 洛谷
- [JLOI2009]二叉树问题 - 洛谷
- 树的分解 - 洛谷
- [NOI2011] 道路修建 - 洛谷
- [YsOI2020]植树 - 洛谷
- 让我们异或吧 - 洛谷
- 选择题 - 洛谷
- [COCI2015-2016#3] MOLEKULE - 洛谷
- [USACO17FEB]Why Did the Cow Cross the Road III S - 洛谷
- 无序字母对 - 洛谷
- `SEARCH` - 洛谷
- Ryoku 的探索 - 洛谷
- [JRKSJ R3] a question - 洛谷
- [NOIP2017 普及组] 棋盘 - 洛谷
- [USACO06DEC]Wormholes G - 洛谷
- 油滴扩展 - 洛谷
- 贪吃虫 - 洛谷
- [USACO09JAN]Laserphones S - 洛谷
- [USACO08NOV]Guarding the Farm S - 洛谷
- [USACO06NOV]Big Square S - 洛谷
- 封锁阳光大学 - 洛谷
- 填涂颜色 - 洛谷
- [USACO07OCT]Obstacle Course S - 洛谷
二:收获:
题型分类:
1.给定条件,建立棋盘,向四个方向DFS寻找符合条件的值
这类题目往往带有例如质数筛选之类的条件判断,先用dfs列举所有组合,然后判断每一种组合是否符合条件。
2.给定条件,建立棋盘,向八个方向DFS寻找符合条件的值
这类问题类似于四个方向的dfs,在四个方向的基础上增加了右上,右下,左上,左下四个方向,这两类问题基本上拿一套代码小改一下就能AC,算是比较简单。
3.筛选符合条件数据/跳过不符合条件的数据
这类问题核心是搜索一步,判断该组数据是否符合条件是否条件,如果符合条件就记录,继续搜索,不断更新符合条件的最优解。直到搜索到边界,输出最优解。
4.求连通块的个数,判断连通块之间关系->DFS漫水填充法
听起来比较高大上,其实就是涂色,把在一起的一堆密闭数据标记成一个特定的数值 ,可以去搜索被标记的点的区域的个数搜索周围没被标记的为0的区域,从四周漫水,如果水能接触到说明中间被围了起来,记录闭合的区域
5:类似于求组合数的特定方向DFS
在dfs函数中传入方向参数。
6:BFS解决最短路径问题
重要的是如何标记走过的步数?如何存储走过的路径?
优化剪枝技巧
1:最优解剪枝
先手动算出一个可能的非最优解,如果接下来的解都超过这个解,那后面的就都不用算了,能直接剪枝。
2:调整搜索起始位置
有些题目答案比较靠后,调整开始位置,能更快找到答案。
3:记忆化搜索
算法:记忆化搜索_Insomnialoveffff的博客-CSDN博客_记忆化搜索,将搜索过的值记录,能够避免重复搜索
搜索与其他知识的联系
1.图的遍历
DFS和BFS是图遍历的两种常用方法。
BFS新题型
1:多源BFS问题,
在某些题目中,给出多个起点以及多个终点,要求输出从某一起点出发到达终点的最短距离
利用常规bfs去从每个终点开始遍历,保留最短距离是可行的,但是时间复杂度往往太大,出现超时的错误。
多源bfs:我们假设一个虚拟起点距离题目中给出的起点距离都为0,从该起点出发bfs遍历,当第一次遍历到目标终点时,这个距离一定是最小的。在进一步,实际代码中可以不设置虚拟起点,而是将所有起点直接加入队列中(理论上等价)。
目前我能解决的问题:
我目前能够独立写出连通块问题,走迷宫。但是剪枝目前做不到,仅仅能够保证最基本的AC.
三:个人感受
最大的感受就是纸上得来终觉浅,绝知此事要躬行。很多算法自己想的明白,用通俗的语言能够表述出来,但是每当真正实践写代码就写不出,甚至写个条件筛选函数都会出问题。必须加强实践能力,积累代码经验。多去研究别人写的代码。