算法全通
文章平均质量分 79
算法是编程的基础,学好算法,编程能力才会好,踏入本专栏,为你的编程之路踏出坚实的一步吧
无双worker
模拟只会猜题意,贪心只能过样例,数学上来先打表,规律一般是DP,组合数学碰运气,计算几何瞎暴力,图论一顿套模板,数论只会GCD,递归递推伤不起,搜索茫然TLE,分治做得像枚举,暴力枚举数第一,数据结构干瞪眼,怒刷水题找信心。
展开
-
重构贪心算法(二)
对于区间覆盖这一类问题,一般情况下都是根据起点或者终点来排序,然后每次贪心的选择最优解从而得到最终答案。原创 2024-08-29 20:13:08 · 1156 阅读 · 0 评论 -
浅说树的基本性质(下)
树的重心也叫树的质心。找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。我们求解树的重心也非常简单,我们还是以任意点的起点,找到一这个点为根的每个点的子树的数量,然后从中找一个最小值就行了,当然我们这里最好去维护一个每个节点与之有关联的节点的节点数,因为有可能是无根树。原创 2024-08-29 14:49:11 · 969 阅读 · 0 评论 -
重构贪心算法(一)
贪心是信息学竞赛中一种很重要的解题方法,他不仅仅是一些题目的正确解法,还可能是一道题目中的部分算法,甚至还可以以错误的算法“骗得”更多的分数。在信息学竞赛中,很多题目往往要求最优解,这就和我们贪心的思维不谋而合,虽然很多时候贪心并不是正解,或者贪心的效率比较低,但是在我们不会做这道题的时候却能带给我们正确的思路。虽然他只是一种基本的算法,但是他的作用不逊于很多高级算法。那么贪心究竟是什么呢?并没有标准答案,在每个人心中,贪心的定义是不同的,思想不同,算法也不同。原创 2024-08-28 20:52:37 · 1279 阅读 · 0 评论 -
浅说树的基本性质(中)
在学会如何写代码之前,我们要先了解一下树的直径的性质。让我们来证明一下上面的两个结论。命题1:直径的两端点一定是两个叶子节点我们这里采用反证法,如果直径的两个端点不是叶子结点,那么必然这个节点一定会有孩子节点,那么这样的路程又可以增加一节,所以原直径并不是这棵树的直径,矛盾。所以直径的两端点一定是叶子结点命题2:距离任意点最远的点一定是直径的一个端点我们这里同样采用反证法,如果距离任意点最远的点不是直径的一个端点,那么这里就有两种情况:我们设当前直径为xy,现有任意点O和另一个点M。原创 2024-08-23 20:46:50 · 1351 阅读 · 0 评论 -
浅说树及其基本性质(上)
在了解树的基本性质之前,我们要先知道什么是树。首先我们知道树分为和,有根树指的是有一个固定的根,无根树指的是没有固定的根,任何一个节点都可以为树,我们一般情况下,只分析有根树树是nn1个结点的有限集。当时这棵树没有节点时,称为空树。在任意一棵树非空树中应满足:(1) 有且仅有一个特定的称为根root的结点;(2) 当n1时,其余结点可分为个互不相交的有限集,其中每一个集合本身又是一颗树,并且称为根的子树(SubTree)原创 2024-08-23 20:12:21 · 937 阅读 · 0 评论 -
算法全面剖析
冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端选择排序( Selection sort)是一种简单直观的排序算法。一般是初学者接触的第一个排序算法,简称为选排。它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在。原创 2024-08-21 15:16:46 · 1075 阅读 · 0 评论 -
最小生成树
一个图中可能存在多条相连的边,我们**一定可以从一个图中挑出一些边生成一棵树。**这仅仅是生成一棵树,还未满足最小,原创 2024-08-21 08:00:00 · 189 阅读 · 0 评论 -
详解并查集
并查集是一种简单但非常高效的数据结构,特别适用于动态连通性问题。通过路径压缩和按秩合并这两种优化技巧,并查集能够以接近常数时间处理合并和查找操作,这在图论算法中具有广泛的应用。原创 2024-08-20 17:36:51 · 962 阅读 · 0 评论 -
洪水填充算法(Flood Fill)和广度优先搜索算法(Breadth-First Search, BFS)的共同点与不同点
洪水填充算法(Flood Fill)定义:洪水填充是一种用于确定图像中与给定起点像素相连的区域的算法。它通常用于图像处理中的区域填充,比如在绘图软件中填充一个封闭区域。目的:主要用于图像处理、区域填充、分区识别等场景。广度优先搜索(BFS)定义:BFS是一种图搜索算法,用于从一个给定的起始节点开始,按层次遍历图中所有节点。它使用队列结构来逐层扩展搜索范围。目的:主要用于图论中查找最短路径、连通性分析、图遍历等场景。原创 2024-08-15 16:46:15 · 445 阅读 · 0 评论 -
图论算法合集
Dijkstra算法是一种用于计算单源最短路径的算法,即从一个指定的起始节点到图中所有其他节点的最短路径。该算法适用于有向图和无向图,但要求边的权重为非负数。Dijkstra算法利用贪心策略,逐步扩展最短路径树。Floyd-Warshall算法适用于计算所有节点对之间的最短路径,时间复杂度为O(n^3),适用于稠密图。Dijkstra算法用于计算单源最短路径,时间复杂度为O((V+E) log V),适用于边权非负的稀疏图。通过实际代码示例和详尽的注释,我们理解了两种算法的核心思想和实现细节。原创 2024-07-27 08:30:00 · 420 阅读 · 0 评论 -
浅说区间dp(下)
好了,到目前为止,普及组所要用到的动态规划问题我们基本上是讲完了,不知道大家有没有收获呢?如果有问题,欢迎到评论区留言,或者私信博主,如果喜欢博主的博客的话,请点一个赞,蟹蟹~~原创 2024-07-16 17:35:35 · 1249 阅读 · 0 评论 -
浅说区间dp(上)
但是和前面合并型区间dp的思考方式有一点区别,我们并不是考虑最后一次拆分,然后前面有k个乘号,那么后面区间就有j-k-1个乘号,然后两这相乘的最大值,如果是这样,那么数组就需要dp[i][j][k]来表示,虽然这样也可以做,但是效率上会低一些,而且消耗的空间也比较大。该题和前面做过的一道合并果子的题类似,但是不一样的地方在于每次只能合并相邻两堆,如果我们贪心的每次选择相邻的最小的两堆合并,那么答案明显是错误的,因为前面合并顺序的不同会影响后面每堆的数量,所以我们要考虑动态规划。回文词是一种对称的字符串。原创 2024-07-15 17:39:16 · 1317 阅读 · 0 评论 -
浅说背包问题(下)
背包问题是线性DP的一个衍生,同时也是比较复杂的动态规划问题的一个简单雏形。动态规划是信息学竞赛的一个重难点,要想学好动态规划,先打好基础是非常有必要的。同样的,背包问题远不止这九类,还有很多类型的比较复杂的背包问题,这里先不做累述了。如果遇到比较复杂的背包问题,或者没有讲解过的背包问题,先看看能否转换前面我们学习过的简单背包问题来处理。一定要仔细分析问题,想出解决该类问题的状态状态转移方程(当前状态怎么由前一状态到达)码了8000多个字,又破记录了。原创 2024-07-14 18:41:35 · 561 阅读 · 0 评论 -
浅说背包问题(中)
有N种物品和一个容量为V的背包。每种物品都有一个体积和价值,以及该物品有多少件。求解怎么装可使这些物品的体积总和不超过背包容量,且价值总和最大。问最大价值是多少13这种背包问题和前面的背包问题不同的地方在于,一种物品可以有很多件,并不是只可以取一件。我们可以把它转换成01背包来求解。每种物品有m[i]件,可以理解为有m[i]种该物品,每种物品只有一件。这就转换成了01背包。但是我们可以注意到这里会去枚举一个数量k,那么这个地方就有问题了,不难发现,k有两个位置可以放如图所示。原创 2024-07-13 20:56:45 · 1095 阅读 · 0 评论 -
浅说背包问题(上)
背包问题是线性DP的一个拓展,它的模型一般为:有一个体积为V的背包,有n种物品,每种物品的数量有限或者无限,每个物体有它的属性(体积、质量等),问在不超过背包体积的情况下如何选择物品才能让物品的属性之和最大。首先,很容易想到贪心是错误的,无论是从大到小贪,还是从小到大贪心的往背包里放物品,都可以找到反例。那么我们在这个地方就要考虑动态规划了。原创 2024-07-11 17:44:31 · 772 阅读 · 0 评论 -
浅说平面dp(下)
wjq刚刚从床上起来,喜欢性感的她要去她寝室的不同位置去拿衣服,可是她的舍友把她的衣服丢的到处都是,黑丝,白丝,制服等衣服散在不同的位置上,wjq只好挨个去拿。wjc由于没有穿鞋,而且用她的粉粉嫩嫩的脚走起来非常的不舒服,然而鞋又在寝室门口,所以她想走一条最短路到教室的门口,但是性感度太少了她自己又不舒服,所以她决定走一条性感程度最高的最短路线(即保证路径最短的前提下性感程度最高),你能帮帮她吗?给定一个长为 n 的序列,任意选择其中连续的 x(0≤𝑥≤n)项所确定的一段更短的连续序列叫作一个子段。原创 2024-07-10 15:37:58 · 1056 阅读 · 0 评论 -
详解平面DP(上)
其实平面DP和正常的dp没有什么本质上的区别,只不过是在二维的面上进行DP,而且,客观的说,其实和递推没有什么区别,不要把他想的太难了。原创 2024-07-09 18:38:00 · 743 阅读 · 0 评论 -
浅说线性DP(下)
动态规划入门详解原创 2024-06-07 18:47:59 · 959 阅读 · 0 评论 -
浅说线性DP(上)
在说线性dp之前,我们先来聊一聊动态规划是啥?原创 2024-05-28 14:32:17 · 1014 阅读 · 0 评论 -
浅说二分答案
前面我们讲的主要都是二分查找,二分查找在考试中一般都不会作为独立算法而存在,一般都是一道题中部分算法,它主要是基于单调性的减少枚举次数。而枚举除了枚举操作还可以枚举答案,枚举答案同样可以用二分来减少枚举次数,这就是比赛中常考的二分答案。很多时候当答案不是很容易直接计算的时候,我们可以考虑枚举答案,但是答案范围特别大,但是又具有单调性的时候,直接一个一个枚举答案效率很低,我们可以考虑二分枚举,如果答案有10亿种,那么二分枚举只需要30次左右就可以枚举完,大大提高了枚举效率。原创 2024-05-23 18:20:52 · 679 阅读 · 0 评论 -
浅说二分查找
在一次商场宣传活动中,你被主持人邀请上台完一个“我想你猜”的游戏。游戏规则如下:主持人先想好一个数字,这个数字在1—1000之间,然后把数字写在纸条上,然后主持人叫你来猜这个数字是多少,每当你猜一个数字之后,如果正确那么就获胜,如果错误,主持人会告诉你你的答案大了还是小了,然后让你继续猜,最后根据你猜的次数来给你分配奖品。现请你设计一种策略保证每次猜数的次数尽可能少。玩这个游戏,除非你会读心术或者内定获胜者,否则你只能凭空猜测,没有任何规律可言。但是我们就只能盲猜了吗?原创 2024-05-16 18:26:33 · 717 阅读 · 0 评论 -
浅说广度优先搜索
在搜索中,最重要的就是求解最短路,我们前面学习的求解最短路的办法无论怎么剪枝就会有重复路径,因为我们的方法都是尝试去走这条路,如果不行再返回,既然是尝试,那么肯定有错误路径。我们有没有办法直接让我们走的每一步路都一定是当前的最短路呢?答案是有的,我们可以按层来搜索,从起点开始,搜索出所有第一层能到达的点,那么从起点到这些点的最短路就知道了,再从这些第一层能到达的所有点依次出发,那么能到达的所有点就是第二层的点,依次类推,那么对于任意一个点,第一次访问到的该点就是起点到该点的最短路径。原创 2024-05-09 18:02:49 · 884 阅读 · 0 评论 -
优先队列讲解
给定一个数列,初始为空,请支持下面三种操作:1.给定一个整数 x,请将 x 加入到数列中。2.输出数列中最小的数,如果数列中没有数,输出0。3.删除数列中最小的数(如果有多个数最小,只删除 1 个,如果数列中没有数,则忽略该操作)。该题需要不停的找最小值,并且删除最小值,如果按照暴力做法,每次删除或者插入一个数,时间复杂度太大了,所以我们需要找到一种能够一直维护当前数组最大/最小值的数据结构,在C++中,就存在这样一种STL—优先队列。原创 2024-05-04 16:01:10 · 402 阅读 · 0 评论 -
队列——用数组来表示
为什么要用数组来模拟队列?因为数组机动性高,可用性高,灵活性也高。原创 2024-04-28 15:18:54 · 206 阅读 · 0 评论 -
双端队列——用数组来表示(下)——高级做法
其实我们可以从末尾来写。就是说我们可以以n为起点,来分开写.这个就是一个显然的空间换时间,这种写法比上一种写快了至少3倍!1:删除当前数组最后一个元素,如果数组中没有元素则忽略;3:删除当前数组中第一个元素,如果数组中没有元素则忽略;2 x:在当前数组最后一个数后面插入一个数x;4 x:在当前数组第一个元素前面插入一个数x;还是我说的,从末尾开写!我们可以通过一个题来讲述这件事。原创 2024-04-27 21:21:34 · 191 阅读 · 0 评论 -
双端队列——用数组来表示(上)——朴素做法
为什么这么说呢?因为STL是死的,是已经固定好了的,那么再一些双端队列的“变种题”中,可能就会失效,但是用数组来模拟,可以随时随地的调换,非常的灵活。同时用数组来模拟的话,常数要小很多,也算是卡了个小常了吧。原创 2024-04-27 21:14:45 · 183 阅读 · 0 评论 -
浅说深度优先搜索(下)——深度优先算法
绕了两个大圈,终于是到了正题了,今天我们就来学一学它!全是干货!原创 2024-04-23 15:54:55 · 1470 阅读 · 1 评论 -
浅说深度优先搜索(中)——回溯
相信在你们不懈的努力之下,基本的递归一定可以写出来了,那么我们现在就来看看递归的升级版——回溯怎么写吧!原创 2024-04-22 18:25:05 · 1298 阅读 · 0 评论 -
浅说深度优先搜索(上)——递归
好久没有讲算法了,今天我们就来谈谈“初学者”的第二个坑,深度优先搜索,其实也就是递归。原创 2024-04-12 19:11:31 · 1294 阅读 · 0 评论 -
01背包问题详解
有一个容量为m(m原创 2024-03-18 18:03:13 · 430 阅读 · 0 评论 -
桶排序——最快的排序方法
排序算法将一串数组(一个列表)中的元素(整数,数字,字符串等)按某种顺序(增大,减小,字典顺序等)重新排列。不失普遍性,我们在此可视化中,只将(可能包含重复)的整数数组排序至非减。桶排序的思想是若待排序的值在一个明显的有限范围内(整形)时,可设计有限个有序桶,待排序的值装对应的桶(当然也可以装入若干个值),同好就是待排序的值,顺序输出各桶的值,将得到有序的序列。排序(冒泡排序,选择排序,插入排序,归并排序,快速排序,计数排序,基数排序) - VisuAlgo。今天我们就来谈谈桶排序。原创 2023-04-18 08:00:00 · 49 阅读 · 0 评论 -
高精度算法——大整数乘法
/从字符强制转换成整数,然后倒序存入。//从字符强制转换成整数,然后倒序存入。顾名思义,高精度算法就是把数字存入数组,再用数组进行运算,只不过不能直接算,而是要——模拟手算!//以下为字符串逆序存储为整数数组。//乘法计算每一位的结果。原创 2023-04-17 19:05:43 · 97 阅读 · 0 评论 -
高精度算法——大整数减法
顾名思义,高精度算法就是把数字存入数组,再用数组进行运算,只不过不能直接算,而是要——模拟手算!while (len > 1 && ans[len - 1] == 0)//去0。1. 读入两个字符串,将其转化为数字存储在数组中,数组下标从0开始,存储的是个位数。if (ans[i] < 0) {//若为负数,即需要借位。原创 2023-04-16 21:06:40 · 87 阅读 · 0 评论 -
高精度算法——大整数加法
& ans[len - 1] == 0) { //如果数组末尾(也就是数字的开头)为0(ans[len-1]==0),则去除掉(len--),但要排除它输入本身就是0的可能(len>1)n1[i] = int(a[lena - i - 1]) - 48;在C++中,常常有输入的值超过long long,那么就会爆!//比较出最长的长度。原创 2023-04-16 18:00:00 · 130 阅读 · 0 评论 -
插入排序程序
排序算法将一串数组(一个列表)中的元素(整数,数字,字符串等)按某种顺序(增大,减小,字典顺序等)重新排列。有很多种不同的排序算法,每一种都有各自的优势和限制。不失普遍性,我们在此可视化中,只将(可能包含重复)的整数数组排序至非减。当读入一个数字时,在已经排好的序列中,找到它的正确位置,然后再放入。但要注意的是在插入这个元素之前,需要把他后面所有的元素都后移一位,以保证当前元素的位置上的原元素不被覆盖。排序(冒泡排序,选择排序,插入排序,归并排序,快速排序,计数排序,基数排序) - VisuAlgo。原创 2023-04-15 21:31:30 · 59 阅读 · 0 评论 -
算法之查找算法
注:因为作者并不觉得那些专用术语对于我们正常学编程的人来说有什么用,写了也看不懂,所以本文只简单介绍了查找算法的用法,对于专业术语并没有引用。原创 2023-08-01 18:36:47 · 54 阅读 · 0 评论 -
算法之排序算法(非比较排序)
对于每一个输入元素 x,确定小于 x 的元素个数,利用这一信息,就可以直接把 x 放到它在输出数组中的位置上了。例如,如果有 17 个元素小于 x, 则 x就应该在第 18 个输出位置上。当有几个元素相同时,这一方案要略做修改,因为不能把他们放在同一个输出位置上。原创 2023-08-03 09:00:00 · 46 阅读 · 0 评论 -
算法之排序算法(比较排序)
冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端选择排序( Selection sort)是一种简单直观的排序算法。一般是初学者接触的第一个排序算法,简称为选排。它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在。原创 2023-08-02 09:00:00 · 50 阅读 · 0 评论 -
算法之贪心算法
注:因为作者并不觉得那些专用术语对于我们正常学编程的人来说有什么用,写了也看不懂,所以本文只简单介绍了查找算法的用法,对于专业术语并没有引用。原创 2023-08-04 09:00:00 · 96 阅读 · 0 评论