
算法全通
文章平均质量分 84
算法是编程的基础,学好算法,编程能力才会好,踏入本专栏,为你的编程之路踏出坚实的一步吧
无双worker
穿川晓月皎明雾,烟起云涌润一花。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
那些正常的动态规划
在说线性dp之前,我们先来聊一聊动态规划是啥?动态规划是普及组内容中最难的一个部分,也是每年几乎必考的内容。它对思维的要求极高,它和图论、数据结构不同的地方在于它没有一个标准的数学表达式和明确清晰的解题方法。动态规划是对求解最优解的一种途径,而不是一种特殊的算法。由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的阶梯方法,而不存在一种万能的动态规划算法。为了方便学习,我们把若干具有代表性的动态规划问题归纳总结成不同的几类,并建立对应的数学模型。动态规划一般用原创 2025-03-24 18:11:59 · 1214 阅读 · 0 评论 -
浅说差分约束
当我们的题目中遇到一些存在不等关系的式子的时候,我们其实可以把它转换成图上问题来解决。为什么呢?我们可以观察一下这两个式子:aj≤ai+wa_j\le a_i+waj≤ai+wdisj≤disi+wi,jdis_j\le dis_i+w_{i,j}disj≤disi+wi,j第一个是我们的要求的式子,第二个是我们在求最短路的时候的式子,是不是可以发现这两个是惊人的相似?那么我们是不是就可以类比一下?我们把 aia_iai 类比成 disidis_idisi ,aja_jaj 类比成 disj原创 2025-03-17 17:22:13 · 792 阅读 · 0 评论 -
浅说最短路
我们在信息学奥赛中,时常会遇到让我们求图上最短路的问题,之前我们可以敲dfs或bfs,但是这两个一个时间复杂度太大了,一个有限制条件,所以说我们还不如重新研究一个算法,所以这就有了最短路算法。但是这里有个点值得注意,最短路算法不仅仅可以用于解决最短路,还可以用于解决一些不等式(组)求解的问题,也就是我们经常说的差分约束。友情提示:在学习这篇之前,请先学习图论基础章如果说,我们只想求一个点到另一个点或者说一个点到其他所有点的最短路的话,这也就是在求单源最短路,一般情况下,单源最短路会用两种算法解决,一个是D原创 2025-03-14 15:34:18 · 454 阅读 · 0 评论 -
浅说图论基础
在学最短路算法之前,我们要先搞清楚另外一个事情,什么是图,我们又可以基于图做那些事情。图不同于树,它是一种更加复杂的数据结构,相比较于树或者数组(线性表)而言,图的关联性显然更加强。比如说,在树中,一个点只有可能和他的父亲节点和他的儿子节点有直接的联系,但是在图中,任意两个点之间都有可能会有联系,也就是说节点之间的连通性是任意的。原创 2025-03-07 15:13:22 · 1220 阅读 · 0 评论 -
浅说树形dp
因为树的形式非常适合递归,他所带来的访问顺序也是非常符合拓扑排序的,故而在处理子树类问题时,dp可以很好的利用相邻层级之间的关系和逻辑,非常符合dp的“口味”,所以我们才有了这个树形dp。树形dp和线性dp没有什么本质上的区别,只不过一个是在树上,一个是在线上,唯一的一个不同点就是树形dp可以大致的定形,而线性dp却不可以。原创 2025-02-15 22:33:25 · 1011 阅读 · 1 评论 -
浅说树上差分——边差分
其实这种差分的思路和点差分的思路差不多,只不过因为是边,所以我们不能直接操作,因此我们要把这个边放到这条边所连接的两个点中的更深一层的点。deepxdeepy→pympxy我们还是一步一步的推,相信在有上节课中教你的推导方式,这个公式也是呼之欲出的,所以我就不做示范了,下来你可以自己试试。这个的话,总结一下就是。至于求得最后的答案,也是和点差分是一样的,所以就不做过多的赘述了。原创 2025-01-23 09:30:40 · 1044 阅读 · 0 评论 -
浅说树上差分——点差分
我们前面也学过差分,现在的话我们就把他放到树上来做。因为这是树,所以会有点和边之分,所以树上差分也会分为和。原创 2025-01-22 17:32:37 · 681 阅读 · 0 评论 -
浅说树上倍增(下)
书接上文。原创 2025-01-20 15:55:22 · 820 阅读 · 0 评论 -
浅说树上倍增(上)
之前我们学过线性倍增,所以我们现在把这种思想放到树上来试试。原创 2025-01-20 15:40:35 · 811 阅读 · 0 评论 -
浅说单调队列
单调队列(Monotonic Queue)是一种特殊的,它是一个队列,并且队列中的元素具有单调性。这种单调性可以是单调递增或者单调递减或呈现出其他的样子。例如,在一个单调递减的队列中,队首元素是队列中最大的元素,并且随着元素的入队和出队操作,队列始终保持递减的性质。原创 2024-12-13 16:21:43 · 1390 阅读 · 0 评论 -
浅说单调栈
有n个人从左到右站成一排,每个人都有一个身高,现要求所有人都向右看齐,问每个人可以看到的最远的人是哪一个?注:一个人右边第一个身高大于等于他的人会挡住这个人的视线。如果没有输出-1。n≤108对于这个题,我们很容易想出暴力的解法,但是这样写的时间复杂度是On2的,在这题的数据范围的情况下是过不了的。同时,我们也会想到从后往前维护最高身高,然后用二分的思路去找,这样是可以,时间复杂度为Onlogn但是也过不了,所以我们只能使用单调栈,一种时间复杂度为On的算法。原创 2024-11-27 18:16:55 · 1003 阅读 · 0 评论 -
细说简单简单莫队
在信竞得路上,我们时常遇到一些题目让我们求解一段区间里的颜色个数有多少啊,这个区间内的最大值是多少啊?诸如此类的问题常常让我们这些菜鸡束手无策,所以莫队算法横空出世!莫队算法是由莫涛提出的算法。在莫涛提出莫队算法之前,莫队算法已经在 Codeforces 的高手圈里小范围流传,但是莫涛是第一个对莫队算法进行详细归纳总结的人。莫涛提出莫队算法时,只分析了普通莫队算法,但是经过 OIer 和 ACMer 的集体智慧改造,莫队有了多种扩展版本,想什么待修莫队之类的。原创 2024-11-26 16:01:18 · 471 阅读 · 0 评论 -
分块——最为优雅的暴力
在信息学竞赛中,常常会遇到一些区间修改或区间查询的题目,如果直接敲暴力的话,时间复杂度是Onm可能会超时,如果写树状数组或线段树的话,又有一点复杂,不易理解,那么这时候就要请出我们今天的主角——原创 2024-11-09 18:36:54 · 1657 阅读 · 0 评论 -
线性dp(下)
最近博主身体不适,更新较慢,请大家体谅体谅。原创 2024-11-01 18:40:12 · 970 阅读 · 0 评论 -
线性dp(上)
在说线性dp之前,我们先来聊一聊动态规划是啥?原创 2024-11-01 18:38:42 · 735 阅读 · 0 评论 -
质数测试——Fermat素数测试和MillerRabin素数测试
Fermat prime teat (费马素性检验)是一种素数判定法则,利用随机化算法判断一个数是合数还是可能是素数。但是这样有可能会错。Miller-Rabin prime test(米勒-拉宾素性检验)是一种素数判定法则,利用随机化算法判断一个数是合数还是可能是素数。卡内基梅隆大学的计算机系教授Gary Lee Miller首先提出了基于广义黎曼猜想的确定性算法,由于广义黎曼猜想并没有被证明,其后由以色列耶路撒冷希伯来大学的Michael O. Rabin教授作出修改,提出了不依赖于该假设的随机化算法。原创 2024-11-01 17:22:42 · 1195 阅读 · 0 评论 -
数学基础算法——质数篇
质数(英文名:Primenumber)又称素数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。而大于1又不是指数的正整数称为合数(规定1既不是质数也不是合数)。原创 2024-10-25 16:48:03 · 2908 阅读 · 1 评论 -
浅说倍增算法——线性倍增
倍增,倍增,顾名思义,就是以一个数成倍的增长,这个数通常是2。当然也会有在不同的时候会以其他的数进行翻倍,比如3,8,16等等,但是都不常见。我们现在就先来讲讲倍增中的线性倍增。原创 2024-10-22 15:27:06 · 1809 阅读 · 0 评论 -
浅说差分算法(下)
二维差分是指对于一个n*m的矩阵a,要求支持操作pro(x1,y1,x2,y2,a),表示对于以(x1,y1)为左上角,(x2,y2)为右下角的矩形区域,每个元素都加上常数a。求修改后的矩阵a。原创 2024-10-21 17:20:49 · 364 阅读 · 0 评论 -
解释一下动态规划中的LCIS问题
LCIS,全称是LongestCommonIncreasingSubsequence,翻译过来就是最长公共上升子序列。这个问题十分有趣,也是最长上升子序列(LIS)和最长公共子序列(LCS)的合解问题,我们先来看一看。原创 2024-10-21 17:12:50 · 946 阅读 · 0 评论 -
Floyd算法通讲
虽然我不知道为什么会有那么多的人在乱讲,但是我无能为力,只能尽量去讲述正确的思路。原创 2024-10-08 18:24:01 · 699 阅读 · 0 评论 -
浅说差分算法(上)
今天我们来讲讲对于数列修改的一个小技巧,原创 2024-09-25 18:23:49 · 845 阅读 · 1 评论 -
重构贪心算法(二)
对于区间覆盖这一类问题,一般情况下都是根据起点或者终点来排序,然后每次贪心的选择最优解从而得到最终答案。原创 2024-08-29 20:13:08 · 1281 阅读 · 0 评论 -
浅说树的基本性质(下)
树的重心也叫树的质心。找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。我们求解树的重心也非常简单,我们还是以任意点的起点,找到一这个点为根的每个点的子树的数量,然后从中找一个最小值就行了,当然我们这里最好去维护一个每个节点与之有关联的节点的节点数,因为有可能是无根树。原创 2024-08-29 14:49:11 · 1208 阅读 · 0 评论 -
重构贪心算法(一)
贪心是信息学竞赛中一种很重要的解题方法,他不仅仅是一些题目的正确解法,还可能是一道题目中的部分算法,甚至还可以以错误的算法“骗得”更多的分数。在信息学竞赛中,很多题目往往要求最优解,这就和我们贪心的思维不谋而合,虽然很多时候贪心并不是正解,或者贪心的效率比较低,但是在我们不会做这道题的时候却能带给我们正确的思路。虽然他只是一种基本的算法,但是他的作用不逊于很多高级算法。那么贪心究竟是什么呢?并没有标准答案,在每个人心中,贪心的定义是不同的,思想不同,算法也不同。原创 2024-08-28 20:52:37 · 1448 阅读 · 0 评论 -
浅说树的基本性质(中)
在学会如何写代码之前,我们要先了解一下树的直径的性质。让我们来证明一下上面的两个结论。命题1:直径的两端点一定是两个叶子节点我们这里采用反证法,如果直径的两个端点不是叶子结点,那么必然这个节点一定会有孩子节点,那么这样的路程又可以增加一节,所以原直径并不是这棵树的直径,矛盾。所以直径的两端点一定是叶子结点命题2:距离任意点最远的点一定是直径的一个端点我们这里同样采用反证法,如果距离任意点最远的点不是直径的一个端点,那么这里就有两种情况:我们设当前直径为xy,现有任意点O和另一个点M。原创 2024-08-23 20:46:50 · 1474 阅读 · 0 评论 -
浅说树及其基本性质(上)
在了解树的基本性质之前,我们要先知道什么是树。首先我们知道树分为和,有根树指的是有一个固定的根,无根树指的是没有固定的根,任何一个节点都可以为树,我们一般情况下,只分析有根树树是nn1个结点的有限集。当时这棵树没有节点时,称为空树。在任意一棵树非空树中应满足:(1) 有且仅有一个特定的称为根root的结点;(2) 当n1时,其余结点可分为个互不相交的有限集,其中每一个集合本身又是一颗树,并且称为根的子树(SubTree)原创 2024-08-23 20:12:21 · 1216 阅读 · 0 评论 -
算法全面剖析
冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端选择排序( Selection sort)是一种简单直观的排序算法。一般是初学者接触的第一个排序算法,简称为选排。它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在。原创 2024-08-21 15:16:46 · 1231 阅读 · 0 评论 -
最小生成树
一个图中可能存在多条相连的边,我们**一定可以从一个图中挑出一些边生成一棵树。**这仅仅是生成一棵树,还未满足最小,原创 2024-08-21 08:00:00 · 287 阅读 · 0 评论 -
详解并查集
并查集是一种简单但非常高效的数据结构,特别适用于动态连通性问题。通过路径压缩和按秩合并这两种优化技巧,并查集能够以接近常数时间处理合并和查找操作,这在图论算法中具有广泛的应用。原创 2024-08-20 17:36:51 · 1066 阅读 · 0 评论 -
洪水填充算法(Flood Fill)和广度优先搜索算法(Breadth-First Search, BFS)的共同点与不同点
洪水填充算法(Flood Fill)定义:洪水填充是一种用于确定图像中与给定起点像素相连的区域的算法。它通常用于图像处理中的区域填充,比如在绘图软件中填充一个封闭区域。目的:主要用于图像处理、区域填充、分区识别等场景。广度优先搜索(BFS)定义:BFS是一种图搜索算法,用于从一个给定的起始节点开始,按层次遍历图中所有节点。它使用队列结构来逐层扩展搜索范围。目的:主要用于图论中查找最短路径、连通性分析、图遍历等场景。原创 2024-08-15 16:46:15 · 951 阅读 · 0 评论 -
图论算法合集
Dijkstra算法是一种用于计算单源最短路径的算法,即从一个指定的起始节点到图中所有其他节点的最短路径。该算法适用于有向图和无向图,但要求边的权重为非负数。Dijkstra算法利用贪心策略,逐步扩展最短路径树。Floyd-Warshall算法适用于计算所有节点对之间的最短路径,时间复杂度为O(n^3),适用于稠密图。Dijkstra算法用于计算单源最短路径,时间复杂度为O((V+E) log V),适用于边权非负的稀疏图。通过实际代码示例和详尽的注释,我们理解了两种算法的核心思想和实现细节。原创 2024-07-27 08:30:00 · 501 阅读 · 0 评论 -
浅说区间dp(下)
好了,到目前为止,普及组所要用到的动态规划问题我们基本上是讲完了,不知道大家有没有收获呢?如果有问题,欢迎到评论区留言,或者私信博主,如果喜欢博主的博客的话,请点一个赞,蟹蟹~~原创 2024-07-16 17:35:35 · 1334 阅读 · 0 评论 -
浅说区间dp(上)
但是和前面合并型区间dp的思考方式有一点区别,我们并不是考虑最后一次拆分,然后前面有k个乘号,那么后面区间就有j-k-1个乘号,然后两这相乘的最大值,如果是这样,那么数组就需要dp[i][j][k]来表示,虽然这样也可以做,但是效率上会低一些,而且消耗的空间也比较大。该题和前面做过的一道合并果子的题类似,但是不一样的地方在于每次只能合并相邻两堆,如果我们贪心的每次选择相邻的最小的两堆合并,那么答案明显是错误的,因为前面合并顺序的不同会影响后面每堆的数量,所以我们要考虑动态规划。回文词是一种对称的字符串。原创 2024-07-15 17:39:16 · 1478 阅读 · 0 评论 -
浅说背包问题(下)
背包问题是线性DP的一个衍生,同时也是比较复杂的动态规划问题的一个简单雏形。动态规划是信息学竞赛的一个重难点,要想学好动态规划,先打好基础是非常有必要的。同样的,背包问题远不止这九类,还有很多类型的比较复杂的背包问题,这里先不做累述了。如果遇到比较复杂的背包问题,或者没有讲解过的背包问题,先看看能否转换前面我们学习过的简单背包问题来处理。一定要仔细分析问题,想出解决该类问题的状态状态转移方程(当前状态怎么由前一状态到达)码了8000多个字,又破记录了。原创 2024-07-14 18:41:35 · 757 阅读 · 0 评论 -
浅说背包问题(中)
有N种物品和一个容量为V的背包。每种物品都有一个体积和价值,以及该物品有多少件。求解怎么装可使这些物品的体积总和不超过背包容量,且价值总和最大。问最大价值是多少13这种背包问题和前面的背包问题不同的地方在于,一种物品可以有很多件,并不是只可以取一件。我们可以把它转换成01背包来求解。每种物品有m[i]件,可以理解为有m[i]种该物品,每种物品只有一件。这就转换成了01背包。但是我们可以注意到这里会去枚举一个数量k,那么这个地方就有问题了,不难发现,k有两个位置可以放如图所示。原创 2024-07-13 20:56:45 · 1157 阅读 · 0 评论 -
浅说背包问题(上)
背包问题是线性DP的一个拓展,它的模型一般为:有一个体积为V的背包,有n种物品,每种物品的数量有限或者无限,每个物体有它的属性(体积、质量等),问在不超过背包体积的情况下如何选择物品才能让物品的属性之和最大。首先,很容易想到贪心是错误的,无论是从大到小贪,还是从小到大贪心的往背包里放物品,都可以找到反例。那么我们在这个地方就要考虑动态规划了。原创 2024-07-11 17:44:31 · 870 阅读 · 0 评论 -
浅说平面dp(下)
wjq刚刚从床上起来,喜欢性感的她要去她寝室的不同位置去拿衣服,可是她的舍友把她的衣服丢的到处都是,黑丝,白丝,制服等衣服散在不同的位置上,wjq只好挨个去拿。wjc由于没有穿鞋,而且用她的粉粉嫩嫩的脚走起来非常的不舒服,然而鞋又在寝室门口,所以她想走一条最短路到教室的门口,但是性感度太少了她自己又不舒服,所以她决定走一条性感程度最高的最短路线(即保证路径最短的前提下性感程度最高),你能帮帮她吗?给定一个长为 n 的序列,任意选择其中连续的 x(0≤𝑥≤n)项所确定的一段更短的连续序列叫作一个子段。原创 2024-07-10 15:37:58 · 1114 阅读 · 0 评论 -
详解平面DP(上)
其实平面DP和正常的dp没有什么本质上的区别,只不过是在二维的面上进行DP,而且,客观的说,其实和递推没有什么区别,不要把他想的太难了。原创 2024-07-09 18:38:00 · 807 阅读 · 0 评论 -
浅说线性DP(下)
动态规划入门详解原创 2024-06-07 18:47:59 · 1013 阅读 · 0 评论