- 博客(14)
- 收藏
- 关注
原创 AcWing 173. 矩阵距离(搜所)
广度优先搜索 + 多源最短路径 原题链接 感悟:这个题啊,其实可以转换个思路,转换成1的格子到其他0的格子的最短路径,就基本知道是多源最短路径的问题。说到多源最短路径有个大名鼎鼎的Floyd算法,不过本题不用这么麻烦,因为读懂题目可知边的权值都是1(相邻边)。可以直接用广搜,等下详细说。还有啊,今天终于报上了心心念念的老师的算法基础课,很激动,尽管自己水平不咋地,还是得加油啊!!! 广搜的基本框架...
2020-04-08 20:46:23
256
原创 AcWing 172. 立体推箱子(搜索)
广度优先搜索 原题链接 感悟:这类题目的基本框架还是很简单的,剪枝都不用思考很多。但状态的表示是个难题,特别的麻烦,只能先总结点大概的处理思路。这题我是想不到这么好的处理方式,特别是三维数组都不是很会用,刷完搜索就去刷刷数据结构类的题吧。 广搜的基本框架(bfs) 题目所给的所有状态的表示 开始与结束状态的储存 基本四个方向的表示 每走一步状态的储存 int bfs() { queue<...
2020-04-06 17:25:13
234
原创 AcWing 170. 加成序列(搜索)
迭代加深 原题链接 感悟:之前用紫书学了下迭代加深,自我感觉应该还是可以的,这次在来实践的时候才发现,除了知道大概要怎么做外,其他的全无头绪。很难受。这道题还是简单题啊!!!从这道题开始总结经验吧,还有老师讲的很好啊。 题型基本框架 数据的存储状态 path[ ] 剪枝 – 枚举对象的顺序 – 判重 int maxd; //限定的深度 for(maxd = 1; ; maxd++) ...
2020-04-06 16:51:38
203
原创 AcWing 168. 生日蛋糕(搜索)
深度优先搜索 + 剪枝 原题链接 感悟:本题的小细节还挺多的,也正是利用这些题目给的小细节来增加剪枝条件的。这个题是我第一次遇到需要一些数学式子推到的题目,尽管不难,但第一次碰到也很蒙,虽然数学的学习还算可以,但应用到一些实际东西上还是无从下手,得加强加强。 NOTE 本题都带有pai,且题目最后不用输出,则一起全部舍去 题目思路 搜索对象及顺序: 深度搜,肯定是对层数下手的,然后从下往上 ...
2020-04-06 16:51:03
207
原创 AcWing 167. 木棒(搜索)
深度搜索 + 剪枝 感悟:开始的时候自己能写一些出来,基本就写个主函数,能想到两个剪枝条件,啊,还得加倍努力啊!!!刚开始听视频讲解的时候觉得有几个剪枝条件有点鸡肋,好像没有什么用,最后在自己深度思考的时候想要弄明白到底有什么差别的时候(因为少了几个剪枝条件就会TTL)才发现很有用,原来是我的理解没到位,再看一次视频讲解发现说的真的好,证明的很到位。 原题链接 题目思路 思路:肯定有num * ...
2020-04-06 16:50:19
218
原创 AcWing 166. 数独(搜索)
深度优先搜索 原题链接 优化非常重要,在这题里更是如此 常见的优化技巧(本题前三种都有使用) 优化搜索顺序 排除冗余信息 可行性剪枝 最优性剪枝(这里没有) 记忆化(就是动态规划了) 本题思路:(剪枝很重要,不然很容易超时) 优先搜索的对象与顺序:可选方案最少的位置 枚举该位置可选的数字 dfs搜索 关键 :弄清楚代码编写时二进制与十进制的转换过程 lowbit(截取二进制最低位1对应的值...
2020-04-06 16:49:40
292
原创 AcWing 165. 小猫爬山(搜索)
深度优先搜索(dfs) 体会 深度优先,就是与回溯法结合,是一种暴力的枚举,可以配合一些剪枝,减少搜索量。 要考虑的问题 枚举对象 dfs的参数 返回条件 剪枝技巧 原题链接 枚举对象: 车的数量,从1开始 。 每次车的数量都需要用for枚举cat的放置情况 dfs 参数: 当前的cat,当前枚举的车的数量 剪枝技巧: 从选择最少的量开始枚举 这里可以将cat的w从大排到小 ...
2020-04-06 16:48:17
256
原创 AcWing 164. 可达性统计(搜索)
图的遍历 原题链接 本题思路 建立一个图的邻接表 每个链表里都储存了与之直连的点,那判断一个点的可达性,可求那些直连点自己链表里储存点的并集 优化方案与技巧 数组模拟邻接表,节约空间 对图进行拓扑排序,即优化搜索顺序 – 拓扑排序的特点是越后面的点直连的点越少,即可行方案越少 bitset 利用bitset存放点,求并集 bitset 将数压缩为二进制形式(内部表现)的十进制(外部表现) ...
2020-04-06 16:46:52
219
原创 AcWing 171. 送礼物(搜索)
深度优先 + 双向搜索 双向搜索:将整个需要搜索的对象分成两半 原题链接 感悟:首先可能会思考动态规划,但它的时间复杂度是(nv)v太大了,不适合。n比较小,可以考虑爆搜。然后这里有个非常好的技巧,就是把原数据分成两半,在通过一些技巧,剪枝,可以有效的降低时间复杂度。 本题思路 先搜索前 N / 2 的数据,枚举所有可能的重量集合,存入数组 对所有重量集合排序,从大到小(顺序优化),判重(排除...
2020-04-05 17:19:23
228
原创 进制转换:十六进制转八进制
开始的想法:十六转十,十转八。写的时候发现转十的时候数太大,不行。 可行的思路:十六转二,二转八。可行。 #include<iostream> #include<string> #include<string.h> #include<math.h> #include<vector> using namespace std; string...
2020-02-23 16:06:57
721
原创 八数码问题
判重 3种解决方法,给出两种(还一种编码解码法) 1.STL 集合 set<int> vis; void init_lookup_table() { vis.clear(); } int try_to_insert(int s) {//判重 int v = 0; for(int i = 0; i < 9; i++) v = v * 10 + st[s][i]; ...
2020-02-08 19:28:57
218
原创 UVa 140 Bandwidth 带宽
“剪枝” --本题的优化方案 可以记录下目前已经找到的最小带宽k。如果发现已经有某两个结点的距离大于或等于k,再怎么扩展也不可能比当前解更优,应当强制把它“剪”掉,就像园丁在花园里为树修剪枝叶一样,也可以为解答树“剪枝(prune)”。 除此之外,还可以剪掉更多的枝叶。如果在搜索到结点u时,u结点还有m个相邻点没有确定位置,那么对于结点u来说,最理想的情况就是这m个结点紧跟在u后面,这样的结点带...
2020-02-07 19:37:07
216
原创 UVa 129 Krypton Factor 困难的串
回溯法练习 一个很好地成对检查 #include<cstdio> using namespace std; int n,L,cnt,A[85]; int dfs(int cur) { if(cnt++ == n) { for(int i = 0; i < cur; i++) { if(i % 64 == 0 && i > 0) pr...
2020-02-07 18:23:56
155
原创 UVa524 Prime Ring Problem (回溯法练习)
UVa524 Prime Ring Problem (回溯法练习) 一些训练时候的小心得,记录记录。 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int is_prime(int x) { //这个判断素数的函数很好有意思 for(int i =...
2020-02-07 16:48:34
151
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅