搜索
qq_38232157
这个作者很懒,什么都没留下…
展开
-
洛谷P1351 联合权值 (深搜)
深搜本题要点:1、首先 n <= 2 * 10^5, 所以时间复杂度就是 O(n), 最多是 O(n * logn)。此时,用 链式前向星来存图。2、假设当前节点是 x,父节点是 fa, x 有若干个 孩子节点 y1, y2, … , yk。那么 ,以x节点为中间节点,并且节点之间的距离的节点对有 (fa, y1), (fa, y2), …, (fa, yk),(y1, fa), (y1, y2), …, (y1, yk) ,…观察到,这些节点之间,都互相组合了一遍,相当于(fa + y原创 2020-09-18 11:24:09 · 113 阅读 · 0 评论 -
洛谷 P2196 挖地雷(深搜,记忆化搜索)
深搜,记忆化搜索本题要点:1、dp[k] 表示从k点开始搜索,能收集最多的地雷数量, 数组dp 初始化为 -1, 表示该点从未搜过,还相当于 vis 的作用。2、dfs(int x), 扫描x 点的所有连接点 y, 如果 dp[y] != -1, 说明 y点未被搜过,就 dfs(y), 否则,直接返回 dp[y].3、至于输出 路径,用数组 Next[k], 表示 k点的下一点是哪个点。 全程维护这个数组即可。最后找到 dp 值最大的点(假设是k点), 就不断地 从 k 点 Next 即可。#原创 2020-09-17 13:26:52 · 120 阅读 · 0 评论 -
洛谷 P3958 奶酪(深搜dfs)
深搜dfs本题要点:1、首先用 long long 来存坐标,然后判断两个球洞是否相交2、用 链式前向星 来存图。 用数组 down[i], up[i] 表示 球 i是否能够接触到上,下表面。3、写个 dfs, 搜到某点 能接触上表面就返回 true。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 1010, MaxM =原创 2020-09-15 21:42:34 · 121 阅读 · 0 评论 -
洛谷 P1019 单词接龙(深搜,字符串)
深搜题目特别注意的地方:每个单词最多出现两次(恶心之处,题目没有说明)本题要点:1、建图:以每个单词为图的点,能接龙的两个单词,这两点就连上边。 n <= 20, 用邻接矩阵 a[i][j] 来存两个单词重叠部分的长度, -1 表示 两个单词不能接龙。 用 链式向前星 方式存图。2、然后就是深搜,用数组 d[i] 表示 点 i 的出现次数,来控制 dfs, 同时, 每次深搜,更新答案 ans.#include <cstdio>#include <cstring>原创 2020-09-11 15:57:40 · 156 阅读 · 0 评论 -
HOJ 1010 Tempter of the Bone(深搜,奇偶剪枝)
深搜,奇偶剪枝题目意思:有个 n * m 的矩阵,有起点S, 终点 D 。要求恰好在 t 步内,从 S 走到 D。而且不重复经过两点。 矩阵中 ‘X’ 表示墙,不能走。本题要点:1、这题被 TLE 卡吐了。后来看到老哥的博客 点这里有个奇偶剪枝。2、其他的就是套用深搜的常用套路, 搞个 vis 数组。上下左右 4个方向。#include <cstdio>#include <cstring>#include <iostream>#include <原创 2020-09-10 00:04:53 · 58 阅读 · 0 评论 -
HOJ 1016 / UVA 524 Prime Ring Problem(算法竞赛入门经典,深搜)
算法竞赛入门经典194页,深搜题目意思: n 个数, 从 1 到 n , 要求排成一圈,使得相邻数的和是素数。 求出所有的排列方式,其中 1 必须在第一位。按字典序输出所有的排列方式。本题要点:1、n <= 20, 可以暴力搜。 显然,只有n是偶数的情况,才可能存在这种排列方式。2、用 vector 来存每一种方式, 再用 set<vector > 来排序。3、素数的处理, 用数组 isprime[i] 表示 i 是否是素数。4、vis[i]表示 第i个数字,是否已经选择,原创 2020-09-09 23:36:38 · 105 阅读 · 0 评论 -
HOJ 1175 连连看(bfs)
bfs本题要点:1、连连看,先保证起点和终点,都不是0,且相等。2、然后从起点 s 开始bfs, 用 step 记录拐弯次数。拐弯不超过两次。3、direction 表示,进入点 (x, y) ,是从哪个方向进来的。比如某一点 (x, y), 它的 direction == 0, 表示 (x, y)的上一点 是 从 左右方向进入 (x, y)。此时,点(x, y) 的下一点,只需要从上下方向寻找。4、点(x, y) 沿着上方向,一直走,直到不能走为止。所谓不能走,就是说,遇到非空白的地方。当原创 2020-09-03 14:07:59 · 148 阅读 · 0 评论 -
UVA 439 Knight Moves(算法竞赛入门经典,bfs,裸题)
/*算法竞赛入门经典177页,bfs,裸题本题要点:1、马走日,有8个方向,写好8 个方向, for(int i = 0; i < 8; ++i)2、套用 bfs 的模型即可。*/#include <cstdio>#include <cstring>#include <iostream>#include <queue>using namespace std;const int MaxN = 9;bool vis[MaxN][Max原创 2020-09-02 18:50:24 · 278 阅读 · 0 评论 -
UVA 1600 Patrol Robot(算法竞赛入门经典,bfs,经典)
算法竞赛入门经典177页,bfs,经典题目意思:有一个 n * m 大小的矩阵, 矩阵 只要数字 0 或者 1,0 表示空白可以走,1 表示有障碍物。现在,要求 从起点 s(1, 1) 走到终点 t (n, m), 这两点都是空白。 每次走,可以连续穿过 k 个障碍物。问,从 s(1, 1) 到 t (n, m) 至少走多少步。本题要点:1、这里的 “连续穿过 k 个障碍物” , 不一定是只要沿着一个方向走,这里的走可以是拐弯的走法。所谓的拐弯,比如,从 点 (1, 1) ,右,下,下,左,原创 2020-09-02 18:47:02 · 94 阅读 · 0 评论 -
POJ 3134 Power Calculus(深搜,迭代加深,估价函数)
深搜,迭代加深,估价函数题目意思:经过若干次乘法和除法运算,由 x 得到 x^n 。问最少的运算次数。本题要点:1、迭代加深:用 递归深度 depth来控制 DFS 的深度。2、估价函数:最快的速度倍增,都无法达到n,则剪枝。#include <cstdio>#include <cstring>#include <iostream>#include <cstdlib>using namespace std;const int MaxN原创 2020-07-31 15:18:04 · 217 阅读 · 0 评论 -
POJ 2225 Asteroids!(三维广搜)
简单的三维 广搜题目意思:给定一个三维空间,有些点能走有些点不能走,每次只能上下,左右,前后六个方向走,给定起始坐标和终点坐标,求从起点到终点最短的路径。本题要点:1、图是按z,y,x给出的,所以在获取起点和终点时也是按z,y,x获取2、三维的 BFS, 有6个方向可以走(前后左右上下), 每次走一步,判断是否越界。3、vis[MaxN][MaxN][MaxN] 表示某点是否被访问过4、 结构体 node 的step,存放的是走的步数。5、 最后,用队列模拟 bfs即可。#include原创 2020-07-31 11:21:29 · 370 阅读 · 0 评论 -
POJ 2251 Dungeon Master(三维广搜)
简单的三维 广搜题目意思:三维空间中,给出 起点 S 和终点 E, 每个位置 是 ‘.’ 则可以通过, 位置是 '#'表示障碍物。要求 ,从起点 S到 终点E ,最少的走多少步。本题要点:1、三维的 BFS, 有6个方向可以走(前后左右上下), 每次走一步,判断是否越界。2、vis[MaxN][MaxN][MaxN] 表示某点是否被访问过3、 结构体 node 的step,存放的是走的步数。4、 最后,用队列模拟 bfs即可。#include <cstdio>#include原创 2020-07-31 11:16:16 · 104 阅读 · 0 评论 -
HOJ 2553 N皇后问题(深搜)
深搜,8皇后问题本题要点:1、打表:n皇后问题的数量,放在 ans 数组, 输出 ans[n]2、检查 皇后放在 第r行,第c列位置:此时,第0 ~ r - 1 行的皇后已经确定。检查 0 ~ r - 1 行 的皇后是否和 (r, c)发生冲突。3、DFSfor(n = 0; n <= 10; ++n), 对于每一个n, 一行一行地放皇后,最后统计有多少种放法。#include <cstdio>#include <cstring>#include <原创 2020-07-31 11:07:20 · 88 阅读 · 0 评论 -
POJ 1606 Jugs(广搜,路径输出)
广搜,路径输出题目意思:给出两个壶的容量A和B, 一个目标水量C,对A、B可以有3种操作,求最少经过几步操作能够在某个壶中得到目标水量C。输入A、B和C,输入最少操作数和操作过程。 题目 和 poj 3414 一样。本题要点:1、状态表示:把A和B壶中水量作为状态,初始状态为<0,0>,每个操作都是状态变化的过程。因为有2个壶,所以总共有6种操作。vis[i][j] 表示第一个水杯装i, 第二个水杯装j 的状态是否出现过。2、用广搜,搜索可能出现的状态, 如果 存在某个状态,a水原创 2020-07-29 17:59:48 · 136 阅读 · 0 评论 -
POJ 3414 Pots(广搜,路径输出,经典)
广搜, 参考 https://blog.csdn.net/tigerisland45/article/details/52208174题目意思:给出两个壶的容量A和B, 一个目标水量C,对A、B可以有3种操作,求最少经过几步操作能够在某个壶中得到目标水量C。输入A、B和C,输入最少操作数和操作过程。本题要点:1、状态表示:把A和B壶中水量作为状态,初始状态为<0,0>,每个操作都是状态变化的过程。因为有2个壶,所以总共有6种操作。vis[i][j] 表示第一个水杯装i, 第二个水杯原创 2020-07-29 11:21:34 · 190 阅读 · 0 评论 -
POJ 3984 迷宫问题(深度优先搜索)
深度优先搜索本题要点:1、题目要求记录路径上的每一点的坐标,这里用 vector 来存。vector<pair<int, int> > ans 记录最优的方案,vector<pair<int, int> > tmp, 记录每一个可行的方案;2、dfs函数:递归边界: if(x == 4 && y == 4),将当前的坐标 (x, y) 放到tmp中往4个方向搜将当前的坐标 (x, y) 从tmp弹出来#include <原创 2020-07-28 22:21:16 · 128 阅读 · 0 评论 -
POJ 3628 Bookshelf 2(搜索)
题目意思:其实很简单啦就是给你n个高度,让你挑其中的几个摞起来。要求摞起来以后的总高度超过b,问你这样的高度的最小值是多少。本题要点:1、暴搜:首先,n最大值是20, 很小,可以暴搜, 复杂度 O(2^20)2、 dfs(int x, int sum) x 表示当前处理到的下标(1 ~ x - 1 都处理完了)。sum 表示 已经当前已经累加的高度。每次 dfs, 可以选择这个身高 w[x], dfs(x + 1, sum + w[x]);也可以不选择 dfs(x + 1, sum);原创 2020-07-05 15:29:20 · 113 阅读 · 0 评论 -
POJ 3322 Bloxorz I(进阶指南,广搜)
算法竞赛进阶指南,112页, 广搜,坐标变换题目意思:4433 小游戏上面的 推木头游戏,http://www.4399.com/flash/13071.htm#search3本题要点:1、长方体的状态表示, (x, y, lie) 其中 x, y 表示坐标,lie 表示长方体怎样摆放lie == 0, 长方体立起来,与地面接触只有 的一面是 1 * 1 的正方形lie == 1, 长方体横向躺着,左半部分在 位置 (x, y)lie == 2, 长方体竖向向躺着,左半部分在 位置 (x, y原创 2020-05-29 17:15:04 · 191 阅读 · 0 评论 -
CH 2601 电路维修(进阶指南,广搜)
算法竞赛进阶指南,120页,双端队列应用到 广搜本题要点:1、题目输入的是 row * col 的 格子, 每个格子表示一条边。而每个格子的顶点,的范围是 0 <= i <= row, 0 <= j <= col;int dist[MaxN][MaxN]; // dist[i][j] 表示顶点(i, j) 到 起点(0, 0) 之间的距离, 显然,dist[0][0];2、 用双端队列存储每一个顶点, 先把起点 (0, 0) 放到 队列中, 如果队列不为空,那么队头出列,原创 2020-05-28 14:47:50 · 199 阅读 · 0 评论 -
CH 2401 送礼物(进阶指南,双向搜索)
算法竞赛进阶指南,111 页,双向搜索,先搜一半,再搜一半本题要点:1、数据直接用 long long 来存,避免溢出麻烦2、从大到小排序,先处理前一半的数据, 看看可以组合出来哪些 数的和是 小于等于 w的( 和 <= w)。用 vector 存储这些和,去重,排序。这里使用vector的 unique 函数 和erase 函数。3、 处理后面一半,得到若干数的和 为sum(sum <= w)。然后在 vector 中二分查找, 最大的一个数 k 使得, k + sum <=原创 2020-05-27 23:41:58 · 208 阅读 · 0 评论 -
CH 2501 矩阵距离(进阶指南,广搜)
算法竞赛进阶指南,115 页, 广搜的常规题目本题要点:1、用 pair 存储坐标点(x和y坐标), 先把矩阵A中的 1 点的曼哈顿距离设置为0, 其余的点设置为无穷大2、先把所有的 曼哈顿距离为0的点(x, y)加入队列queue,然后其上下左右四个坐标点(x + dx[i], y + dy[i]) ,如果不超出范围,并且距离能更新为一个更小的值,就更新该点(x + dx[i], y + dy[i]),并把它加入队列中;#include <cstdio>#include <c原创 2020-05-27 17:18:48 · 149 阅读 · 0 评论 -
POJ 2248 Addition Chains (迭代加深搜索, 进阶指南)
算法竞赛进阶指南,110 页题目意思:求满足下列条件的数列。•a0 = 1•am = n•a0 <a1 <a2 <… <am-1 <am对于每个k(1 <= k <= m),存在两个(不一定不同的)整数i和j(0 <= i,j <= k-1),其中ak = ai + aj注意:1、假设序列的长度为 depth ,依次增加长度,再深搜,直到找到满足要求的序列2、假设当前已经选好的序列为 path[1], path[2], … , pat原创 2020-05-26 14:53:48 · 338 阅读 · 1 评论 -
CH_2201 小猫爬山 (进阶指南,搜索)
1、 用一个数组,cab[MaxN], 记录每一辆车上所有猫的重量;void dfs(int now, int cnt) //now 表示当前已经有多少只猫上车,车的数量是 cnt;cab[i] += cat[now]; //选择某一辆车 cab[i] 辆装当前猫 cat[now]dfs(now + 1, cnt); //递归cab[i] -= cat[now]; //递归出来,车 cab[i] 辆不装当前猫 cat[now]2、 先排序,从大到小,优先安排重量大的猫上车;3、 对于cnt原创 2020-05-20 15:14:31 · 336 阅读 · 0 评论