
dfs
文章平均质量分 72
相关总结及OJ练习
Ypuyu
Ypuyu
展开
-
[bfs+dfs] lg-P1141 01迷宫(bfs+染色法求连通块+模板题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:P1141 01迷宫2. 题目解析染色法和并查集是求连通块个数的两大方法,本题练习下搜索和染色法求连通块,算作是一个模板题,搜索写的少,出了各式各样的问题。思路:所有连通格子的答案是一样的,为连通块的格子总数。本题有多组询问,故可以每次求出一个连通块中的所有答案。当询问是新的连通块的时候,此时该位置答案没求出,则 bfs 去求该块所在连通块的格子数量。否则,当询问是已经求过的连通块时,则直接输出即可。bfs 需要数组模拟队列,队列中的所原创 2021-04-09 19:26:43 · 432 阅读 · 0 评论 -
[Mdfs] lc698. 划分为k个相等的子集(剪枝优化+经典题+好题)
本题十分经典、重要。4 大剪枝方法缺一不可。具体的剪枝方法正确性的证明可以去看看。原创 2024-08-25 05:03:10 · 486 阅读 · 0 评论 -
[M模拟] lc3249. 统计好节点的数目(dfs+图遍历+统计子树节点个数+周赛410_2)
如果用 lambda 表达式来写 dfs 函数的话,就不会有这个问题…可能是 1e5 的情况下,传参太耗时间了吧,没搞懂这个问题。挺不错的题目,思路本身并不难,但是比赛中的写法一直被最后一个样例卡,且比赛完后,还是被最后一个样例卡…原创 2024-08-11 15:43:08 · 573 阅读 · 0 评论 -
[E二叉树] lc572. 另一棵树的子树(dfs嵌套+前中序判断+树哈希+树上KMP+好题)
还是简单粗暴一点,直接搞一个 前序+中序,进行判断即可。我们知道通过 前序+中序,是可以构建出一颗唯一的二叉树的,当然可以通过 前序+中序,去判断两颗二叉树是不是一样的。每个点,都可能是目标子树的根节点,同时我们需要判断当根节点确定时,该根节点的子树是否等于目标子树。看到这个题目就感觉不简单,因为写了写 dfs 版本的,发现好像不太会…评论区有提到 树上 HASH 的方法字节面试过…至于其他的写法,看官解吧。前、中 序判断二叉树。原创 2024-08-04 04:48:25 · 640 阅读 · 0 评论 -
[Mdfs] lc3067. 在带权树网络中统计可连接服务器对数目(邻接表+图操作基础+技巧+好题)
挺有意思的一道题目,重点是要能够读懂题目,然后结合几个图相关的处理技巧即可拿下。原创 2024-06-09 13:10:38 · 522 阅读 · 0 评论 -
[Mdfs] lc39. 组合总和(dfs+经典+细节处理+组合型枚举)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:39. 组合总和2. 题目解析需要统计所有的方案数,那么完全背包在这貌似就不能使用了。就暴力搜所有方案就行了。暴搜顺序是很重要的,在这顺序遍历数组中的每一个数,并枚举它可能取的所有个数,就能不重不漏的搜完所有可能方案。代码细节:path 当前层的元素添加要放到 dfs 的后面。因为一开始枚举的是一个都不选的情况,即 i=0 的情况,所以不要一开始就加进去。回溯的时候,恢复现场。和枚举个数的时候类似,当前 dfs 添加了多少个就 pop原创 2020-12-23 22:48:45 · 348 阅读 · 0 评论 -
[Hdfs] lc726. 原子的数量(模拟+dfs+栈+字符串处理+好题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:726. 原子的数量进阶题:第十八次CCF计算机软件能力认证:3284. 化学方程式栈题解:wzc大佬写的栈题解2. 题目解析题意十分明确,像是一个模拟、栈的问题。但是要写出精巧的代码很困难。每个化学元素以大写字母开头,后跟小写字母,系数组成。嵌套括号的话,每个括号内部应该单独处理。一般用栈维护左括号、右括号匹配情况。也可用 dfs 来处理。本题要求按照字典序输出,那么每个括号内部的元素用 map<string, int>原创 2021-07-05 15:11:03 · 244 阅读 · 0 评论 -
[Mdfs] lc47. 全排列 II(dfs搜索顺序+去重处理+知识理解+经典)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:47. 全排列 II2. 题目解析前导题:[Mdfs] lc46. 全排列(dfs+经典)依旧两种暴搜方案,数字枚举所有位置、位置枚举所有数字。若是要求字典序输出,则只能拿后者来做了,就顺序枚举所有空位置,且从小的数开始往进放,即可保证字典序。针对重复元素的处理,可以先将整个数组排序,重复元素则相邻,可以在暴搜过程中加这样一个判断:如果和当前元素相等的前面一个元素还没有用,那么当前元素就不能用。即保证了排列前后相同数的相对位置不发生改原创 2020-12-25 16:53:09 · 309 阅读 · 0 评论 -
[dfs] aw171. 送礼物(双向dfs+算法技巧+思维+好题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:171. 送礼物相关:[bfs] aw175. 电路维修(双端队列广搜+dijkstra理解+好题+难题)2. 题目解析从题目来理解双向 dfs。本题在思想上显然是一个 01 背包裸题,但是由于数据范围过大,使用 01 背包会超时,且背包容量在此是在 [1,231−1][1,2^{31} - 1][1,231−1] 之间的,所以数组元素也开不下。可以通过暴搜枚举每种物品选不选两种情况得到所有方案,思想等同于二进制枚举。但是时间将会达到原创 2021-06-18 15:44:19 · 282 阅读 · 3 评论 -
[dfs] aw170. 加成序列(dfs迭代加深+模板题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:170. 加成序列2. 题目解析迭代加深: 当我们在 dfs 过程中,搜索树可能会很深,然而答案所在位置可能比较浅。此时可能用 bfs 会更好,但是当层数较深时,当前层状态数量就很多,bfs 队列存储不下。此时,dfs 迭代加深就是非常好的选择。迭代加深在搜索时,针对答案前面的层数会反反复复搜到,但是并不影响它整体的效率。因为相较于最后一层那恐怖的指数级状态而言,前面所有层的状态数量之和都无法与之比较。所以,迭代加深针对前面几层的重复搜索是可原创 2021-06-18 00:02:26 · 223 阅读 · 1 评论 -
[dfs] aw168. 生日蛋糕(dfs剪枝与优化+分类讨论+思维+公式推导+数学+好题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:168. 生日蛋糕2. 题目解析非常非常经典的题目,优化很难…首先的首先,理解题意,问题抽象。在总体积为 n,总层数为 m 的情况下确定每层的 r 和 h,使得要去的蛋糕外表面积最小。首先确定枚举顺序,枚举每层情况,再枚举每层的 r 和 h,保证 r、h 是递增的整数。枚举的种类是指数级别的,需要加入大量剪枝才可能通过本题。优化:优化搜索顺序:从底向上枚举蛋糕每一层,因为底层占用体积大,后续分支少。每层中先枚举 r 再枚举 h 且也原创 2021-06-17 21:02:06 · 362 阅读 · 1 评论 -
[dfs] aw167. 木棒(dfs剪枝与优化+分类讨论+思维+好题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:167. 木棒2. 题目解析直接给这道题的剪枝方案和思想 orzorzorz 了…首先的首先,理解题意。本题抽象就是:给定 n 个数,将这 n 个数分成和相等的组,其中每个数只能用一次,求这些和相等的分组中所有元素最小的和。 这已经高度抽象了。名词约定:木棒:砍断之前的完整木棒,是输出答案。木棍:砍断之后的短木棍,是题目输入。首先确定枚举顺序,可以从小到大一次枚举木棒长度,再枚举每个木棒是由哪些木棍拼出来的,如果木棍能够恰好用完原创 2021-06-17 15:32:46 · 344 阅读 · 1 评论 -
[dfs] aw166. 数独(dfs剪枝与优化+状态压缩+代码技巧+好题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:166. 数独前置题:[Hdfs] lc37. 解数独(dfs+经典) 在力扣中算难题了!2. 题目解析直接暴力按元素枚举会 TLE,但能过样例。首先确定枚举顺序,枚举空格子的所有可填数字即可。其次,针对常见的 dfs 四大优化,在本题中看看是如何应用的:优化1:优化搜索顺序。每个空格子能填的数字个数是不同的,我们优先选择可选状态比较少的空格子来填,这样分支比较少,是个很重要的优化。优化2:排除等效冗余。本题中无冗余,因为是按原创 2021-06-17 11:20:16 · 277 阅读 · 0 评论 -
[dfs] aw165. 小猫爬山(dfs剪枝与优化+好题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:165. 小猫爬山相似的搜索顺序:[dfs] aw843. n-皇后问题(模板题+经典)不错的题解,提供了两种方式。完全一致:[dfs] aw1118. 分成互质组(dfs搜索顺序+dfs状态定义+最大团+好题)2. 题目解析有关搜索顺序:本题和 [dfs] aw1118. 分成互质组(dfs搜索顺序+dfs状态定义+最大团+好题) 的搜索顺序一致。顺序枚举每个猫,枚举所有组,看当前猫能放到哪个组中即可。 这样一定能枚举到所有情原创 2021-06-16 22:44:07 · 313 阅读 · 0 评论 -
[dfs] aw1118. 分成互质组(dfs搜索顺序+dfs状态定义+最大团+好题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:1118. 分成互质组2. 题目解析当这个数据比较大的时候,要使用最大团算法。 其中的优化比较难,这个数据比较小,所以可以直接暴搜。最大团思路:将 n 个数看成 n 个点,若两数不互质则将两点之间建立一条边,则问题将转化为如何将这些点尽可能分成少的组,使得组中各点没有边相连。暴搜思路: 按顺序考虑每个数,考虑每个数放到哪个组里。也是按组枚举,枚举第一个组中选哪些数,第二个组中选哪些数。优化1:针对当前数,有两种放入方式:能放原创 2021-06-16 10:01:06 · 248 阅读 · 0 评论 -
[dfs] aw1117. 单词接龙(dfs搜索顺序+递归理解+好题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:1117. 单词接龙2. 题目解析很不错的一道题。题意:给定 n 个字符串,进行单词接龙模式,找到最长的接龙串。要求不能整个串都作为接龙的公共部分。给定了一个龙头字符,接龙串首字符必须和这个????字符保持一致。每个串最多只能使用 2 次。数据量比较小,可以暴力枚举搜索所有情况,关键是怎么来搜索能枚举到所有方案。可以先枚举以龙头开头的字符串,然后再枚举能接到它后面的所有情况,直到拓展到的串后面无法进行接龙了,那么当前就形成了原创 2021-06-15 21:04:44 · 133 阅读 · 0 评论 -
[dfs] aw1116. 马走日(dfs搜索顺序+模板题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:1116. 马走日2. 题目解析模板题,注意一开始 dfs(x, y, 0, res) 是错误的,应该是 dfs(x, y, 1, res)。因为一开始起点 (x, y) 不需要进行判断,默认被搜到了,即直接被置为 st[x][y]=true。如果是 1*1 的方格,那么一进去起点就应该被判断,它是无法进行 8 方向拓展的,所以应该一进去传 1。时间复杂度:O(指数级)O(指数级)O(指数级)空间复杂度:O(n2)O(n^2)O(n2原创 2021-06-15 18:41:30 · 177 阅读 · 0 评论 -
[dfs] aw1113. 红与黑(dfs连通性模型+dfs计数方式+模板题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:1113. 红与黑2. 题目解析模板题,注意起点也算一个砖块。时间复杂度:O(n2)O(n^2)O(n2)空间复杂度:O(n2)O(n^2)O(n2)dfs#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int N = 2原创 2021-06-15 14:23:45 · 149 阅读 · 0 评论 -
[dfs] aw1112. 迷宫(dfs连通性模型+模板题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:1112. 迷宫2. 题目解析模板题,注意判断起点、终点是否为 '#' 为不可走状态即可。时间复杂度:O(n2)O(n^2)O(n2)空间复杂度:O(n2)O(n^2)O(n2)#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const原创 2021-06-15 13:31:04 · 111 阅读 · 0 评论 -
[dfs] aw3483. 2的幂次方(dfs+好题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:3483. 2的幂次方有个暴力题解写的不错,可参考这个暴力+打表一看就会~2. 题目解析一道经典题目,原题。dfs 思路:以 137=2^7+2^3+2^0 为例。2^7 要将 7 单独拿出来看,即 7=2^2+2+2^0。故这就递归起来了。string dfs(int n) 返回 n 的 2 的幂次方的表示形式。从高位到低位扫描 n 的比特位,若当前比特位为 0,则不需要考虑。若为 1,则为 2^i 那么同理需要递归处理 i 的 2原创 2021-05-20 08:54:30 · 108 阅读 · 0 评论 -
[dfs] aw3481. 阶乘的和(dfs+二进制枚举+01背包+常见问题+错误记录)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:3481. 阶乘的和2. 题目解析阶乘增长速度很快,9!=362880,0!=1,所以其实就是前 10 个数只能选 1 次,能否凑出 n 的问题。也就是枚举这 10 个数的子集。二进制枚举,dfs,01 背包均可。代码:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int原创 2021-05-16 21:51:38 · 140 阅读 · 0 评论 -
[图dfs] aw846. 树的重心(dfs+图+好题+模板题+思维)
文章目录1. dfs + 图1. dfs + 图Biu思路:邻接表存树,注意无向边,正反存两次就行了考虑连通块种类重心删除后的各个子树构成的连通块重心父节点所在的连通块我们可以通过 dfs 得到以任意节点作为根节点,它子树的节点数量,可以让 dfs 就返回以当前重心作为树的节点数量,记为 size(u),那么,dfs 下去再回溯上来就是重心的各个子节点作为根节点的点数量,那么在这些中取 max 就是重心删除后各个子树构成连通块的最大值了,再拿这个最大值与 n-size(u) 取个最原创 2020-10-25 21:15:54 · 249 阅读 · 1 评论 -
[dfs] aw3502. 不同路径数(dfs+基础题+贝壳找房2021)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:3502. 不同路径数2. 题目解析一道简单题。一看这数据范围,小的可怜,直接暴力做就行了。一共走 5 步,每步四个方向,则一个起点会有 454^545 种走法,起点有 5∗5=255*5=255∗5=25 种走法,则总共也就只有 25600 种方案,直接 dfs 暴搜即可,每种方案数值长度最多是 6 位,所以总的计算量就是 15W,左右。前导零也不需要考虑,也不需要考虑每个点只能走一次的情况…简化了太多了。时间复杂度:O(n2)O原创 2021-05-13 23:24:33 · 99 阅读 · 0 评论 -
[Hdfs] lc1723. 完成所有工作的最短时间(dfs+状压dp+周赛223_4)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:1723. 完成所有工作的最短时间2. 题目解析本题正解应该是状压 dp,但由于好久好久没弄困难的 dp 问题了,手太生。这个 n 又这么小,还是暴搜会比较香。每个数两种情况,要么加到现有组中,要么自成一组。也快到临界值了,得加上剪枝优化,dfs() 参数存一个最大值,不要自己循环求最大值这妥妥超时,也不要用 min() 来更新最大值,这样就不是剪枝了。当传递的参数最大值还没全局最大值小的时候,后面的情况都不需要再考虑了,直接 return原创 2021-01-16 22:05:28 · 229 阅读 · 0 评论 -
[Mdfs] lc1849. 将字符串拆分为递减的连续值(dfs+二进制枚举+周赛239_2)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:1849. 将字符串拆分为递减的连续值2. 题目解析细节蛮多的一道题,首先字符串是 20 位,那么最多的分割线也只有 19 段,所以暴力枚举就是 219=5242882^{19}=524288219=524288 种情况。在此使用二进制枚举分割线的方式来解题。细节:至少存在一段,则从 1 开始枚举到 n-1 段,即枚举 n-1 个分割线。考虑本题有 20 位数字,那么使用 long long 的话最多是 9e18 是 19 位数字,但是原创 2021-05-07 21:12:44 · 210 阅读 · 0 评论 -
[模拟] 数列重组(牛客+库函数+模拟+暴力dfs)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:数列重组2. 题目解析暴力枚举全排列,再暴力判断三段是否有序即可。全排列:有序数组下,采用 next_permutation(q.begin(), q.end())。判断有序:is_sorted(a.begin(), a.end(), cmp) 其默认为升序排序,支持自定义排序。常见简化代码的操作。枚举将数组分成三段,就枚举分界点即可,但是要注意,区间一定是左开右闭的,若是 [1,1) 其实里面是没有数的,is_sorted() 在原创 2021-04-16 11:21:42 · 192 阅读 · 0 评论 -
[线性dp] 导弹防御系统(最长上升子序列模型+贪心+dfs)
文章目录0. 前言1. LIS +贪心+dfs0. 前言强相关:[线性dp] 最长上升子序列(模板题+最长上升子序列模型) 贪心解法[线性dp] 拦截导弹(最长上升子序列模型+贪心)1. LIS +贪心+dfs187. 导弹防御系统重点: 线性 dp、LIS 问题、贪心思路:[线性dp] 拦截导弹(最长上升子序列模型+贪心)是高度只能不断下降。本题高度可以不断上升和不断下降,但需要维护其单调性。即,最少使用多少个上升、下降子序列将整个序列覆盖掉。[线性dp] 拦截导弹(最长上升子序列原创 2020-11-18 18:40:09 · 289 阅读 · 0 评论 -
[记忆化搜索] 滑雪(模板题+记忆化搜索)
文章目录0. 前言1. 记忆化搜索模板题0. 前言动态规划问题可以使用记忆化搜索 + 递归来求解。也是 dfs 优化的方式,两者本无区别。1. 记忆化搜索模板题901. 滑雪重点: 记忆化搜索、递归实现 dp思路:状态定义:f[i][j]:所有从 (i, j) 开始滑的路径的最大值状态转移:分类依据:滑的方向就是上下左右四个方向,当下一个位置的高度低于当前高度的是个更新状态即可显然,计算 f[i][j] 时,需要提前计算得到前一个转移过来的状态,然后再这样一直往前找,是原创 2020-11-12 14:06:23 · 853 阅读 · 0 评论 -
[dfs] aw843. n-皇后问题(模板题+经典)
文章目录1. dfs + n 皇后1. dfs + n 皇后Biu经典 dfs 问题,n 皇后问题,一般有两种解法:按元素枚举,因为共 n2n^2n2 个位置,每个位置两种情况,放和不放,则总共的时间复杂度为 O(2n2)O(2^{n^2})O(2n2)按行枚举:主要记录对角线 dg[u+i]dg[u+i]dg[u+i],反对角线 udg[n−u+i]udg[n−u+i]udg[n−u+i] 数组,数组中的下标 u+iu+iu+i 和 n−u+in−u+in−u+i 表示的是截距,就是将整个棋原创 2020-10-24 12:43:17 · 561 阅读 · 0 评论 -
[dfs] aw842. 排列数字(全排列+模板题+经典)
文章目录1. dfs + 全排列1. dfs + 全排列Biu经典 dfs 问题,给定数字 n 相当于给了 n 个空格,我们可以依次枚举每个数,相当于将数填入空格中去。开辟一个等大的 bool 数组用以标记该数是否已经被用过了,枚举每个空格位置应该填什么,在当前空格位置枚举所有提供的初始数字:若该数在之前已经被用过了,则跳过未被用过则添加到当前全排列中dfs 下一个位置,同时一定记得在最后恢复现场,回溯必备递归搜索树如下,ipad 手绘,win10 下的画图挺好用的,但是还是没手绘来的原创 2020-10-24 11:55:50 · 298 阅读 · 0 评论 -
[dfs深搜] 3. 最大黑色区域(dfs、递归、常规解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:dfs+递归+常规解法1. 题目来源链接:最大黑色区域2. 题目说明3. 题目解析方法一:dfs+递归+常规解法深搜小变形,从左上角开始,找到一个黑点(map[i,j]=1),然后 dfs(i,j),dfs 到的点置为 0,一次 dfs 完毕得到一个返回值 max,就是这个黑区域的面积。主程序中通过打擂台记录最大的 max 给...原创 2020-03-21 22:11:58 · 1521 阅读 · 1 评论 -
[dfs深搜] 2. 瓷砖(dfs、递归、常规解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:dfs+递归+常规解法1. 题目来源链接:瓷砖2. 题目说明3. 题目解析方法一:dfs+递归+常规解法深搜模板题,注意在读入数据时不要从数组边界读入,从 map[1][1] 开始读入,防止深搜导致数组溢出的情况。还有就是方向数组的使用,能显著减少那四次的重复代码。参见代码如下:#include <iostream&...原创 2020-03-21 21:30:11 · 387 阅读 · 0 评论 -
[dfs深搜] 1. 体积(dfs、递归、巧妙解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:dfs+递归+巧妙解法1. 题目来源链接:体积2. 题目说明3. 题目解析方法一:dfs+递归+巧妙解法按标签刷题,是一道 noip 的 dfs 经典例题,递归+去重即可。这道题目对训练递归思维很有帮助,也是一道经典题目了。可以在本地进行单步调试,很有帮助。参见代码如下:#include <iostream>...原创 2020-03-21 21:07:47 · 444 阅读 · 1 评论