![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
AcWing算法基础课 课程记录
文章平均质量分 97
AcWing算法基础课的学习笔记分享
.SacaJawea
这个作者很懒,什么都没留下…
展开
-
毕业!第六章 贪心(一、二)——区间问题,Huffman树,不等式与推公式
所有的区间按照右端点排序,每次选择一个区间,使之与已经选择的互不相交区间不相交。经典Huffman问题,节点权值与根节点的距离具有负相关性,权值越大的节点离根节点的距离越近,权值越小的节点离根节点的距离越远,此时合并果子消耗的体力最小。由于之后的区间右端点都是大于等于当前区间右端点的,所以只要后续区间与当前区间相交,那么当前区间的右端点也被后续区间包含。前面的数乘以的数较大,后续的数乘以的数较小,t乘以的数从大到小,要使得结果最小,就要使t从小到大。若后续区间与当前区间互不相交,那么选择该区间的右端点。原创 2023-07-23 07:06:47 · 130 阅读 · 0 评论 -
第五章 动态规划(三)计数,数位,状压,树形dp与记忆化搜索
核心:先放横着的,再放竖着的。即将当前列的二进制状态与前一列的二进制状态做按位与操作,得到的结果为0,说明没有方块冲突,当前列的方块可以摆放。当前列的方块摆放完成后,若出现连续的空格且空格数量为奇数,那么这个位置无法摆放竖着的方块,说明当前列的摆放是非法的。思考最后一步,枚举前一列的前一列的摆放状态k,在k的状态上摆放j状态,所有使得摆放后状态合法的k状态数量就是。注意,j为二进制表示,这是状态压缩的体现,1表示当前行的前一列已经摆放方格,0表示当前行的前一列没有摆放方格。原创 2023-07-22 08:54:02 · 69 阅读 · 0 评论 -
第五章 动态规划(二)——线性dp与区间dp
对于长度为6的上升子序列的倒数第二个数,其肯定小于最后一个数,那么也肯定小于长度为5的上升子序列的最后一个数。在最长上升子序列长度相等的情况下,不同的上升子序列最后一个数不同,我们只要保存这些子序列中最后一个数的最小值即可,这里有贪心的思想:长度相同的情况下,最后一个数越小,那么它后面可能接的数就越多,上升子序列的长度可能越大。增:在A序列的最后增加一个字符,使得A序列的前i+1个字符和B序列的前j个字符相等,此时需要保证A序列的前i个字符和B序列的前j-1个字符相等,且增加的字符为。原创 2023-07-21 08:46:34 · 82 阅读 · 0 评论 -
第五章 动态规划(一)——背包问题
区别就在于完全背包可以选择无限次,直到背包能装下k个物品,却装不下(k+1)个物品,此时k最大,背包能装最多的第i个物品。状态计算:常说的状态转移方程,本质就是集合的划分,如何将集合划分成更小的子集,同时保证子集中的元素不重不漏?选择第i个物品时,由于物品能选择无限次,直到背包装不下为止,假设背包能装下n个第i个物品,那么此时的状态为。可以划分成两个集合,一个集合选择第i组物品中的某一个,一个集合不选择第i组物品,两个集合不重不漏组成。状态表示:从前i组中选,体积不超过j的所有选法,属性为价值的最大值。原创 2023-07-19 10:05:30 · 194 阅读 · 0 评论 -
第四章 数学知识(四)——容斥原理与博弈论
必败的局面为:所有奇数台阶的石子不为0,偶数台阶的石子为0,此时只能从奇数台阶拿石子到偶数台阶,但是对方能拿走你拿下的石子。)元素个数,有些项是两个,有些是三个,最多到n个。因此,若双方都尽力在赢,那么双方就能使异或结果非0的局面转换到异或结果为0,也能使异或结果为0的局面转换为非0。定义Mex运算,找到一个集合中不存在的最小的非负整数,也就是说在集合中,小于该数的所有非负整数是存在且连续的。推广:若已知一点连通的其他点,我们需要从0开始枚举这些点的SG值,找一个不存在且最小的值,作为当前点的SG值。原创 2023-07-14 18:48:43 · 219 阅读 · 0 评论 -
第四章 数学知识(三)——高斯消元,组合
因为`(a / b) % m!矩阵中存储的是每个未知数的系数,每一行第一个未知数的系数都是1,使用初等行变换,只保留每一行的第一个非0系数,将该系数所属列的其他系数都变换成0。上面的模板中,第一个for之后,对于矩阵的第i行来说,只有前i - 1个元素为0,所以要把第i + 1到最后的元素用初等行变换变为0。若最后的矩阵是完美阶梯型,要获取未知数的解,就要使第i行只有第i个元素为1,其他元素都要为0,此时该方程为。找出所有不符合题目要求的路径,将总的路径数减去不符合题意的路径数,就能得到我们想要的答案。原创 2023-07-13 17:41:37 · 245 阅读 · 0 评论 -
第四章 数学知识(二)——欧拉函数,快速幂,扩展欧与中国剩余定理
用于每次联立两式求出的x满足非负最小,重复n - 1求出的x也满足非负最小,局部最优推出全局最优,所以一定能保证对于所有的方程来说,x是非负最小的。对于一个除数b,若存在一个整数x,使得用x做乘法运算的结果,与原除法运算结果相同,那么x就是b的乘法逆元。可以看成c ≡ x (mod m),要求最小非负整数,x就要在m的剩余系中,所以x = c mod m。,得到一个新的线性同余方程,将其与第k个线性同余方程联立,重复以上所有操作,求出满足两式的非负最小x。总之:记住这个结论,很常用。原创 2023-07-11 14:46:29 · 155 阅读 · 0 评论 -
第四章 数学知识(一)——质数与约数
题目要求n个数的乘积的约数个数,分解乘积的质因数与分解其约数的质因数得到的结果是相同的。一个正整数N,可以被分解成多个式子乘积的形式,每个式子是质数的幂运算。的范围中变化时,整个式子相乘的结果就是不同的,整个式子相乘能得到约数,所以得到的约数也是不同的。左边公约数为右边公约数的子集,右边公约数为左边公约数的子集,即左右两边的公约数相同。我们从最小的质数开始,不断地分解n,比如8被分解成3个2相乘,也能被分解为。中已知的质数,每次把当前质数与i的乘积筛掉,因为这个乘积一定是合数。原创 2023-07-06 09:19:27 · 205 阅读 · 0 评论 -
第三章 搜索与图论(三)——最小生成树与二分图
也可以理解为迭代n次,每次选择一条与集合距离最短的边加入集合,不过第一次迭代无法选择边,只能随便选一个点作为集合中的元素,后续的迭代就是选择边(已经被匹配的情况下,可以让对方的匹配对象重新匹配。考虑完成的点一定无法匹配,虽然考虑完成分为匹配成功与匹配失败两种情况,但是匹配成功后,st数组失去了意义(由于需要判断的图可能是非连通图,所以需要遍历每一个点,若当前点没有染色,则将其作为dfs的起点进行染色。然后试着匹配下一条邻边的对象,若对方的匹配对象需要重新匹配,那么他就不应该试着匹配已经考虑完成的点。原创 2023-07-04 16:09:16 · 1239 阅读 · 0 评论 -
第三章 搜索与图论(二)——最短路问题
文章目录单源最短路朴素Dijkstra堆优化版DijkstraBellman Ford算法SPFASPFA求负环多源汇最短路Floyd最短路练习题849. Dijkstra求最短路 I850. Dijkstra求最短路 II853. 有边数限制的最短路851. spfa求最短路852. spfa判断负环854. Floyd求最短路源点表示起点,汇点表示终点一些认识:m和n2n^2n2一个级别是稠密图,m和n一个级别是稀疏图最短路问题不区分有向图与无向图,因为无向图是一种特殊的有向图,能解决有向图的原创 2023-07-03 09:36:08 · 743 阅读 · 0 评论 -
第三章 搜索与图论(一)——深搜,广搜,图的存储与拓扑序列
所有连通块包含两部分,一是以当前节点的子节点为根节点的连通块,以及删除当前节点与其子节点为根节点的连通块,剩下的部分也是一个连通块。若当前位置位于的行超过了矩阵的行,对矩阵的遍历结束,此时判断已经放置的皇后数量与题目要求的是否相等,若相等则输出棋盘。根据以上连通块的数量,维护一个最大值。即一个无向图,每个点的入度都不为0,那么从一个点开始,通过其入边能找到这条的起点,此时已经遍历了图中的2个点。枚举队头的所有出边,假设队头表示的点为t,删除队头的所有出边,假设出边的终点是u,即删除t->u。原创 2023-07-02 19:18:25 · 774 阅读 · 0 评论 -
第二章 数据结构(二、三)——Trie树,并查集,堆与哈希表
由于堆需要满足某些性质,元素插入后可能要进行元素间的交换,由于元素后续可能的改动,所以第k个插入的元素与数组下标没有直接的关系。最后修改每个节点的父节点为根节点的操作,是从根节点的子节点开始修改,向下到当前节点结束。用Trie树存储所有的数据,从每一个数据的高位开始,Trie树只存储0与1,由于所有的数都是整数,所以Trie数不存储符号位,即Trie的高度为31。堆的元素是连续存储的,若支持删除操作,那么第k个插入的元素在数组中的下标不一定是k,这个假设总是成立,无论是在插入数据前还是在插入数据并维护后。原创 2023-06-27 19:59:08 · 617 阅读 · 1 评论 -
第二章 数据结构(一)——链表,栈和队列与kmp
为减少重复的比较运算,找出这些字符的最长前后缀,因为这些字符和S串的某部分是相同的,那么这些字符串的后缀和S串的某部分的后缀也是相同的,和后缀相同的前缀与S串的某部分的后缀也是相同的。当一个元素入栈后破坏了这种单调性,为了维护单调性,我们需要pop栈顶元素,使栈顶元素的优先级小于要入栈的符号,从而使该符号入栈后,栈仍然具有单调性。时,表示删除头节点之后的数,也就是第一个插入的数。遍历表达式时,若符号栈的栈顶符号优先级大于等于要入栈的符号,进行eval运算,直到栈为空或者栈顶符号优先级小于等于要入栈的符号。原创 2023-06-21 21:20:44 · 734 阅读 · 0 评论 -
第一章 基础算法(三)—— 双指针,位运算,离散化与区间合并
对于影响结果的值,保存它们的位置到一个数组中,此时这些位置与数组下标旧构成了一个唯一的映射关系。我们可以根据数据原来的位置,在保存离散数据位置的数组中二分,找到该位置的下标,该下标就是原位置的新位置,也就是连续存储的位置。所以需要进行预处理,使这些离散的值连续,用数组将值的位置保存,将这些离散的位置用数组下标重新映射,使之成为连续的位置。当某个数能作为不重复的数时,我们需要保存该数,这里直接在原地保存,即从原数组的开头往后保存这些不重复的数。因此,每次计算该序列的长度,更新出整个序列中最长不重复子序列。原创 2023-06-21 08:30:00 · 626 阅读 · 0 评论 -
第一章 基础算法(二)——高精度,前缀和与差分
文章目录高精度运算高精度加法高精度减法高精度乘法高精度除法前缀和二维前缀和差分二维差分高精度练习题791. 高精度加法792. 高精度减法793. 高精度乘法794. 高精度除法前缀和练习题795. 前缀和796. 子矩阵的和差分练习题797. 差分798. 差分矩阵高精度运算两个大数做运算,位数一般是1e6大整数的存储,数组的低位存储整数的低位,类似于小端存储高精度加法Ai + Bi + t:每一位相加,再加上进位,一开始进位为0用t变量保存Ai和Bi相加的结果,不过需要先判断这两个数是否存在原创 2023-06-20 20:20:53 · 389 阅读 · 0 评论 -
第一章 基础算法(一)—— 快排,归并与二分
利用归并的性质,合并有序数组时,两个有序数组其实是两个左右区间,左区间的数字下标小于右区间的所有数字。根据二分出来的答案,判断答案是否满足题目要求,进而判断题目是否有解。确定一个性质,使左右区间中其中一个区间满足该性质,另一个区间不满足该性质。二分的本质不是单调性,有单调性的题目一定可以二分,但是可以二分的题目不一定具有单调性。因此,找到一个性质,左右区间的边界点就可以二分出来。红绿区间的交界处,其中一个交界就是要查找的数。作为区间的左端点,没有变化。的性质,此时左边区间的边界就是要查找的。原创 2023-06-20 20:10:08 · 530 阅读 · 0 评论