
深搜
文章平均质量分 61
Brightess
毕业于湖南城市学院
目前在某游戏大厂搬砖(
展开
-
VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)
并查集 dfs原创 2023-05-04 18:07:53 · 986 阅读 · 0 评论 -
美团2017年CodeM大赛-资格赛 NC13224 送外卖(记忆化搜索 or 预处理 dfs)
记忆化搜索 or 预处理 dfs原创 2022-09-15 20:58:14 · 432 阅读 · 0 评论 -
CodeForces-1324F Maximum White Subtree(换根dp 联通子图信息查询)
换根dp 联通子图信息查询原创 2022-08-24 23:58:06 · 255 阅读 · 0 评论 -
Codeforces 1092F Tree with Maximum Cost(换根树形dp 二次扫描法)
换根dp 二次扫描原创 2022-08-23 17:21:13 · 274 阅读 · 0 评论 -
Daimayuan 501 距离和(换根树形dp 入门讲解)
换根dp 二次扫描原创 2022-08-21 22:22:53 · 234 阅读 · 0 评论 -
AtCoder abc_264 C - Matrix Reducing(嵌套 dfs)
嵌套 dfs原创 2022-08-14 16:50:36 · 894 阅读 · 0 评论 -
AcWing 321. 棋盘分割(记忆化搜索 二维区间DP 二维前缀和)
题意:给定一个 8×8 的棋盘,棋盘的 每个小方格 都有一个 权值 wx,y每次我们可以对棋盘进行一次 横切 或 竖切,将 棋盘 分成两块矩形的 子棋盘分割完一次后,我们可以 选择两个 子棋盘 中的一个 再继续 递归 操作可以发现题目中给的这个图片,右边这个并不是递归下去做的:他对第一次分割的两个矩形又分别进行了分割(题目要求我们只能保留一个继续分割)现需要把棋盘按照上述分割方案,分成 n 块(n−1 次划分操作)求一个划分方案,使得各个子棋盘的 总分的均方差最小思路:本题如果用...原创 2022-04-12 22:21:14 · 339 阅读 · 1 评论 -
AcWing 479. 加分二叉树(区间dp记录方案 二叉树前、中序遍历)
题意:给定二叉树的中序遍历:1、2、3、…、n,我们知道会有不同的形态,题目要求我们求出 所有形态中分值最大的方案(输出其对应的前序遍历)思路:我们知道,一棵子树 的 中序遍历 在 整棵树的中序遍历序列中 一定是 连续的一段dp[l, r] 状态表示集合:当前 以 l 为左端点,r 为右端点的区间 作为 中序遍历,生成树的方案属性:所有方案中的最大分数dp[l, r] 状态表示(集合划分的依据:根据根节点在区间[L,R]的不同位置进行划分)我们假设根节点在区间[L,R]中的第k个点,那...原创 2022-04-11 21:09:37 · 723 阅读 · 0 评论 -
AcWing 323. 战略游戏(树形dp scanf格式化输入)
本题是 AcWing 285. 没有上司的舞会 的对偶题题意:每条边上至少选择一个节点,可以选择的最小权值。思路:树形dp,与没有上司的舞会具有对称性没有上司的舞会:每条边上最多选择一个点,求最大权值战略游戏:每条边上最少选择一条点,求最小权值状态表示f[u][0]:所有以u为根的子树中选择,并且不选u这个点的方案f[u][1]:所有以u为根的子树中选择,并且选u这个点的方案属性:Min状态计算当前u结点不选,子结点一定选f[u][0]=∑(f[si,1])f[u][0]=...原创 2022-03-24 21:55:17 · 2999 阅读 · 0 评论 -
AcWing 1073. 树的中心(树形dp)
题意:给定一棵树,树中包 含 n 个结点(编号1~n)和 n−1 条 无向边,每条边都有一个权值。在树中找到一个点,使得 该点到树中其他结点的最远距离最近。思路:我们以题目给出的样例构建一棵树:分别求出每个点到其它所有点的最长距离,在 所有距离之中取最小值考虑一下 每个点到其它所有点距离 分为哪几类我们可以分为 两大类,第一大类:从 当前点开始往子节点走 的距离(往下)第二大类:从 当前点开始往父节点走 的距离(往上)其中第一大类可以用 上一题:AcWing 1072. 树的..原创 2022-03-24 12:56:47 · 867 阅读 · 0 评论 -
AcWing 1072. 树的最长路径(树形dp)
参考 彩色铅笔题意:在一棵全为无向边,且带边权的树中找到一条长度最大的路径并输出最大长度思路:这是一道比较经典的 树形DP 题目,我们来一步步来剖析这个问题我们知道:树上 任意两点 的路径是 唯一确定的,因此我们可以暴力枚举 起点 和 终点 找出最长路径如果这样做的话,我们来思考一下时间复杂度:枚举 起点 和 终点 — O(n2)O(n^2)O(n2)找出两点之间的路径长度 — O(logn)O(logn)O(logn)但是光是枚举 起点 和 终点,时间复杂度 就直接拉满了,..原创 2022-03-23 21:45:48 · 1189 阅读 · 0 评论 -
dfs深度优先遍历 求树上各节点代表子树大小
输入格式第一行包含整数 n,表示树的结点数。接下来n-1行,每行包含两个整数α和b,表示点a和点b之间存在一条边。输出格式输出一个长度为n的sz序列,表示树上节点1~n所代表子树的大小。数据范围1≤n≤10^5输入样例91 21 71 42 82 54 33 94 6输出样例:9 3 2 4 1 1 1 1 1运用AcWing 846. 树的重心的思想,并稍作修改即可。#include<bits/stdc++.h>using namespace std原创 2022-03-23 11:27:16 · 2007 阅读 · 0 评论 -
AcWing 846. 树的重心(树形dp雏形:树的dfs遍历)
树的深度优先遍历框架时间复杂度为:O(n + m) (n 为点数,m 为边数)使用一个bool数组记录每个节点的遍历情况,防止重复遍历void dfs(int u){ st[u]=true; // 标记一下,记录为已经被搜索过了,下面进行搜索过程 for(int i=h[u]; ~i; i=ne[i]) { int j = e[i]; if(!st[j]) dfs(j); }}题意:重心定义:重心是指树中的一个结点,如果将这..原创 2022-03-23 10:47:47 · 1976 阅读 · 2 评论 -
AcWing第 41 场周赛 4310. 树的DFS(C题:dfs序典型例题)
dfs序 是很多树问题的基础时间复杂度:O(n)#include<bits/stdc++.h>using namespace std;const int N = 2e5+10;int n, m;vector<int> g[N];int q[N], p[N], top;int sz[N];void dfs(int u){ sz[u] = 1; q[top] = u, p[u] = top; top ++ ; fo...原创 2022-03-05 21:41:13 · 245 阅读 · 0 评论 -
Codeforces Round #774 (Div. 2)
A Square Counting#include<bits/stdc++.h>using namespace std;#define int long longsigned main(){ int t; cin>>t; int n, s; while(t--) { cin>>n>>s; if(n*n<=s)原创 2022-03-05 14:25:53 · 235 阅读 · 0 评论 -
AcWing 1118. 分成互质组
题意:给定 n 个正整数,将它们分组,使得每组中任意两个数互质。问:至少要分成多少个组?思路:dfs,对每一个元素,我们有两种操作:①:放到现有组中的最后一组中(依次枚举最后一组的所有元素,判断新加的元素是否与它们全部互质,如果是的则加入)②:新开一个组并放入用p[N]存放n个元素二维数组group[N][N]存放每个组我们从第一个组 g=1,组内没有数 gc=0,当前用掉了 cnt=0 个元素,当前组还未开始遍历数 start=0 的初始状态开始搜索。每次搜索的时候判断是否可以..原创 2022-03-04 21:46:21 · 592 阅读 · 0 评论 -
AcWing 1111. 字母(内部搜素dfs 回溯)
题目描述给定一个 R×S 的大写字母矩阵,你的起始位置位于左上角,你可以向上下左右四个方向进行移动,但是不能移出边界,或者移动到曾经经过的字母(左上角字母看作第一个经过的字母)。请问,你最多可以经过几个字母。样例输入样例:3 6HFDFFBAJHGDHDGAGEH输出样例:6思路:运用dfs,dfs过程中每个节点记录一下横、纵左边以及步数step,迭代出最大步数。算法(dfs)blablabla时间复杂度O(uncertain)O(uncertain)O(uncert..原创 2022-03-03 22:43:52 · 298 阅读 · 0 评论 -
AcWing 1026. 乘积最大(dfs迭代更新)
题目描述给定一个数字串,经过k次分割为k+1份,问各个部分累乘的最大值是多少?样例有一个数字串:312, 当 N=3,K=1 时会有以下两种分法:1)3*12=362)31*2=62这时,符合题目要求的结果是:31*2=62。思路:相当于在 上一题 基础上顺便迭代一个额外信息将数字串长度n分为k+1个数字相加,搜索出每一种情况,(可以参考: AcWing 4181. 数的划分,过程几乎一致的,但本题还有所削弱,上一题数据范围更大 )比如当n=4,k=2时可以搜索出这三种情况:4..原创 2022-03-03 21:10:10 · 588 阅读 · 0 评论 -
AcWing 4181. 数的划分(dfs组合类型枚举 + 可行性剪枝)
题目描述将整数 n 分成 k 份,且每份不能为空,即不能为0,问有多少种不同的分法。样例当 n=7,k=3 时,下面三种分法被认为是相同的:(1,1,5),(1,5,1),(5,1,1)。算法(dfs)搜索顺序:k个坑位,依次枚举每个坑位应该填啥,类似于排列数字,每枚举完一个坑位判断一下当前收集到的总和sum是多少,由于题设要求是组合类型枚举,因此可以人为规定一个递增的顺序,所以再设置一个变量last存储上一层选择的是什么数字,根据last和sum来缩小每次枚举的范围,即 [las..原创 2022-03-03 19:16:54 · 467 阅读 · 0 评论 -
AcWing 129. 火车进栈(dfs搜索 出栈顺序)
题意:若一个栈的输入序列为1、2、...、n ,求其可能的出栈顺序,并输出前20种方案。思路:我们可以将搜索中的每一个状态用三者来表示:state1(已经出栈的答案序列,用vector存),state2(还在栈中的序列,用一个stack存),state3(还未进栈的序列,直接用一个指向 即将入栈元素 的指针变量表示,因为未进栈的车是有序的)。我们实际操作只有两种:op1:车栈state2弹出栈顶元素并加入state1答案序列op2:将state3所指向的元素压入state2车栈..原创 2022-03-03 16:08:12 · 536 阅读 · 0 评论 -
AcWing 1117. 单词接龙(预处理节点关系dfs)
题意:如题。思路:1、通过贪心的思想,两个字符串拼接,重合部分越短,拼接后的长度越长,因此,需要预处理出所有单词两两拼接重合的最小长度,g[][]表示第i个字符串与第j个字符串拼接重合的最小长度2、从给定的字符开始,确定单词龙的第一个单词,向所有能够拼接到第一个单词后面的单词进行深度优先遍历3、dfs(drag,tail):drag表示当前的单词龙,tail表示当前字符串的单词尾巴,也就是上一个连接的单词简单来说:判断两个单词能否连接到一块(则连一条边),先预处理一个存储这样关系的二维邻接矩..原创 2022-03-03 12:07:02 · 254 阅读 · 0 评论 -
AcWing 1116. 马走日(dfs搜索顺序)
AcWing 1116. 马走日原创 2022-03-03 10:08:32 · 608 阅读 · 3 评论 -
AcWing 1113. 红与黑(dfs实现floodfill)
题意:有个铺满方形瓷砖的矩形房间,瓷砖只有红或黑两种颜色。某人在一块砖上,他可以移动到相邻的四块砖上。但他只能走黑砖,不能走红砖。统计一下总共可以到达多少块黑色的瓷砖。思路:用dfs实现floodfill算法对于这种问题,既可以用DFS,又可以用BFS。DFS代码比较短,但存在爆栈的风险,BFS代码较长,没有爆栈的风险且可以求得最小值深搜有两种模型第一种是棋盘内部从某个地方到另外一个地方(内部搜索,为了保证每个点只被搜索一次,不能回复现场,即不回溯),第二种是把棋盘当作一个整体(整个...原创 2022-03-03 09:31:27 · 362 阅读 · 0 评论 -
AcWing 1112. 迷宫(内部搜索无需回溯)
只对细节进行分析:为什么不需要恢复现场呢(st[x][y]=false)?“因为st[x][y]标记当前点(x,y)被搜索到,当你恢复现场的时候,假设你是从(px,py)搜到点(x,y)的时候,你在判断(x,y)可以被(px,py)到达之后已经将(x,y)计数一次,当你下次再从某个(px2,py2)搜到(x,y)的时候,此时要通过st[x][y]判重,如果你恢复现场,那么你将再从将(x,y)进行重复搜索,容易TLE,所以不要恢复现场”(与马走日进行对比)要注意把判断障碍物的if(g[x][y]=...原创 2022-03-02 13:31:17 · 499 阅读 · 0 评论 -
AcWing 842. 排列数字(dfs分析本质)
[//]: # (打卡模板,上面预览按钮可以展示预览效果 ^^)如何用 dfs 解决全排列问题?dfs 最重要的是搜索顺序。用什么顺序遍历所有方案。对于全排列问题,以 n = 3 为例,可以这样进行搜索:DFS#include<iostream>#define cin std::ios::sync_with_stdio(false); cin.tie(0); cinusing namespace std;const int N = 8;int path[N]..原创 2022-03-02 10:17:50 · 659 阅读 · 0 评论 -
AcWing 843. n-皇后问题(两种搜索顺序比较)
思路1:本题有多种搜索顺序,这里给出两种搜索方式。第一种搜索顺序:思想与全排列思想一模一样,从前往后依次枚举每个皇后放置在哪一列(每一行只能放一个皇后且必须放一个皇后),相当于在全排列中设置n个位置,并依次枚举每个位置应该选什么数字。递归搜索树的绘制也可以参考上一题注意剪枝:放置皇后的同时判断该位置是否合法(有无冲突),如不合法,则没必要往下递归了,直接回溯其实我们也可以先完全像上题一样将n的全排列搜出来,再判断方案是否合法。不要row数组进行判重的原因:我们枚举的时候是按行枚举的,枚举...原创 2022-03-02 11:09:18 · 481 阅读 · 0 评论 -
POJ 1190 生日蛋糕(爆搜+四次剪枝优化)
Problem7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时,要求Ri > Ri+1且Hi > Hi+1。由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。令Q = Sπ请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。(除Q外,以上所有数据皆为原创 2022-01-21 17:48:03 · 870 阅读 · 0 评论 -
AcWing 4213. 最小结果(深搜)
有四个整数 a,b,c,d。有三个操作符 op1,op2,op3,每个操作符要么是 *(表示乘法),要么是 +(表示加法)。现在,我们要进行如下操作:从现有整数中选出两个,按 op1 进行运算,得到结果。将选出的两个整数舍弃,并将结果保留。此时我们还剩下三个整数。从现有整数中选出两个,按 op2 进行运算,得到结果。将选出的两个整数舍弃,并将结果保留。此时我们还剩下两个整数。从现有整数中选出两个,按 op3 进行运算,得到结果。将选出的两个整数舍弃,并将结果保留。此时我们只剩下一个整数。我们希望原创 2022-01-23 23:55:06 · 303 阅读 · 0 评论 -
acwing165.小猫爬山(dfs剪枝 优化搜索顺序)
翰翰和达达饲养了 N 只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。翰翰和达达只好花钱让它们坐索道下山。索道上的缆车最大承重量为 W,而 N 只小猫的重量分别是 C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过 W。每租用一辆缆车,翰翰和达达就要付 1 美元,所以他们想知道,最少需要付多少美元才能把这 N 只小猫都运送下山?输入格式第 1 行:包含两个用空格隔开的整数,N 和 W。第 2…N+1原创 2021-09-30 15:12:35 · 338 阅读 · 0 评论 -
杂题选做 NC230337:Where is +(爆馊水题)
题目描述有一个正整数 n,现在需要把n拆分成两个整数 t1 和 t2。比如:20可以拆成2和0;321可以拆成32和1,也可以拆成3和21。请问:对于给定的n,t1+t2的最大值是多少?并输出该最大值。输入描述:输入一个正整数(n∈[10,10^9 ])输出描述:输出答案示例1输入48输出12说明48 可以拆成 4 和 8,所以答案等于 12。首先本题数据范围在1e9,我们根据题目意思枚举数位的话,完全可以裸的暴力枚举,让我们来折腾一下,用深搜来实现它。在这个题目中我训练到的原创 2022-01-23 19:09:07 · 600 阅读 · 0 评论 -
AcWing 166. 数独(dfs剪枝,二进制优化)
一、思路:每次挑选一个空白的格子,枚举这个位置应该填几(1~9,但可能不是所有数字都可以填,还需要满足某些性质)在当前空格中我们要在1~9之中选择一些符合要求的数字,依次枚举这个格子选择可选的数字,每枚举完一个数后递归到下一层 。假设我们已经把当前空白格填上了数字2,下一步递归时,和之前的步骤相类似,即随便选择一个还未填好的位置,用同样的方式枚举这个位置可以填写哪些数字。选定之后再递归地枚举下一个数,直到把所有的空白位置全部填满为止,就找到了一组合法的解。如果过程当中有一个格子什么数都填写不了原创 2022-01-14 17:48:13 · 522 阅读 · 0 评论