算法笔记
文章平均质量分 95
记录学习过程,文章中的题目参考了ACwing算法基础课、提高课,以及《算法进阶指南》。
路哞哞
一些笔记和心得而已。
展开
-
第0章 基础问题(1)
出发要回到偶数格子,一定要保证它有有偶数个格子才行,所以总共格子数目为奇数的时候一定无解。棋盘格子总数为偶数的时候,不一定有解,比如只有一行或者一列的时候,就无解。为奇数,则不染色,否色染色,如下图。来分别表示星期一、星期二、…棋盘格子总数为奇数,一定无解。对原图补充两个矩形后,顺时针翻转。对棋盘中的格子染色,如果其坐标。的棋盘,总的格子数目为奇数。c++ 自带的稳定排序。对一周的每一天使用下标。的时候,则存在如下序列。...原创 2022-07-20 17:52:48 · 181 阅读 · 0 评论 -
第0章 基础问题(2):树相关的问题(主要是二叉树)
求将每个点作为最高结点的时候,它到其所有儿子结点的最长距离和次长距离,该值就是以该节点为最高结点的最长路径。求一棵表达式树的中缀表达式等价于对树做中序遍历,并在中序遍历的时候添加上括号。每一次不是复制(返回),而是直接加上。分别代表先序遍历和中序遍历的左右边界。因为在C++中函数返回。......原创 2022-08-17 13:03:19 · 270 阅读 · 0 评论 -
第二章 数据结构(2)
基本思想:每一个集合用一个树来维护,每个集合的编号是根结点的编号,对于树的每个结点,都存储它的父结点的信息。当用于查找某个结点属于哪一个集合的时候,就用当前结点的父结点不断向上递归查找,直到找到根结点,根据根结点编号就可以知道它属于哪个节点。用于快速处理:假设使用存储结点的父结点。三个问题:并查集的两个优化并查集的扩展核心操作9.1 合并集合ACWing 8369.2 格子游戏ACwing 1250某一步会形成环,等价于对两个点加边之前,这两个点已经在同一个连通块中。这个题就等价于:从前往后合并,直原创 2022-07-30 17:08:03 · 241 阅读 · 0 评论 -
第三章 搜索(1):BFS
目录1、Flood Fill(洪水覆盖/填充算法)1.1 池塘计数1.2 城堡问题1.3 山峰和山谷2、最短路模型(所有边权值相同的图)2.1 走迷宫2.1.1 游戏2.2 迷宫问题 (记录方案)2.3 图中点的层次2.4 武士风度的牛2.5 抓住那头牛2.7 地铁修建(BFS + 二分)3、多源BFS3.1 矩阵距离4、最小步数模型4.1 八数码4.2 玛雅人的密码4.3 魔板5、双端队列广搜5.1 电路维修6、双向广搜 (一般用于优化最小步数模型)6.1 字串变换7、A* (一般用于优化最小步数模型)7原创 2022-05-16 17:49:54 · 362 阅读 · 0 评论 -
第三章 搜索(2):DFS
目录1、连通性模型1.1 迷宫1.2 红与黑2、搜索顺序模型2.1 马走日2.2 单词接龙2.3 分成互质组3、剪枝与优化模型4、迭代加深模型5、双向DFS6、IDA*关于回溯:先dfs再改变当前状态不需要恢复现场,先改变当前状态再dfs则需要恢复现场换一种解释:一种将DFS过程看成是在棋盘体内部进行搜索,从一个点搜索到另一个点,为了保证每个点仅能搜索一次,是不能恢复现场的;一种将DFS过程看成是把棋盘看成一个整体,从一个状态搜索到另一个状态,那么久需要先恢复状态才能继续搜索下一个状态。1原创 2022-05-18 15:51:14 · 407 阅读 · 0 评论 -
第四章 图论(2):多源汇最短路模型
目录1、牛的旅行2、排序3、观光之旅4、牛站1、牛的旅行2、排序3、观光之旅4、牛站原创 2022-05-20 15:22:42 · 205 阅读 · 0 评论 -
第四章 图论(3):最小生成树模型
目录1、最短网络2、局域网3、繁忙的都市4、联络员5、连接格点6、新的开始 (最小生成树 && 虚拟原点)7、北极通讯网络8、走廊泼水节9、秘密的牛奶运输 (次小生成树)最小生成树算法Prim:邻接矩阵Kruskal:稀疏图,时间复杂度O(mlogm)O(mlogm)O(mlogm)最小生成树的理论基础任意一棵最小生成树一定可以包含无详图中权值最小的边给定无向图G=(V,E),n=∣V∣,m=∣E∣G=(V,E),n=|V|,m=|E|G=(V,E),n=∣V∣,m=∣E∣原创 2022-05-20 22:25:49 · 700 阅读 · 0 评论 -
第四章 图论(4):SPFA求负环、差分约束、LCA
目录一、SPFA求负环1.1 虫洞1.2 观光奶牛 (01分数规划)1.3 单词环二、差分约束2.1 糖果2.2 区间2.3 排队布局2.4 雇佣收银员三、最近公共祖先 (LCA)3.1 祖孙询问 (倍增法)3.2 距离 (Tarjan算法)3.3 次小生成树3.4 闇の連鎖一、SPFA求负环一般会和01分数规划结合负环:一个环且环上所有权值之和小于零负环对最短路径的影响:如果在求最短路径的过程中走进了负环,每在负环里面旋转一圈,总的权值就会减少,所有会导致路径无限旋转。求负环的方法,基于SP原创 2022-05-22 10:02:45 · 187 阅读 · 0 评论 -
第四章 图论(5):连通分量
目录一、有向图的强连通分量1.1 受欢迎的牛1.2 学校网络1.3 最大半连通子图1.4 银河二、无向图的双连通分量2.1 冗余路径2.2 电力2.3 矿场搭建一、有向图的强连通分量1.1 受欢迎的牛1.2 学校网络1.3 最大半连通子图1.4 银河二、无向图的双连通分量2.1 冗余路径2.2 电力2.3 矿场搭建......原创 2022-05-22 22:36:18 · 884 阅读 · 0 评论 -
第四章 图论(6):二分图
目录1、关押罪犯2、棋盘覆盖3、机器任务4、骑士放置5、捉迷藏二分图 = 不存在奇数环 = 染色法不存在矛盾匈牙利算法:匹配、最大匹配、匹配点、增广路径增广路径:先从左边非匹配点走,先走非匹配边,然后沿着匹配边,非匹配边、匹配边、非匹配边、匹配边…,最终走到右边一个非匹配点。如果存在这样一条路径,那么可以将所有匹配边删去,留下所有的非匹配边形成匹配边,且原非匹配边的数量比原匹配边的数量多1。最大匹配 = 不存在增广路径最小点覆盖、最大独立集、最小路径点覆盖(最小路径重复点覆盖)二分图中:最大原创 2022-05-23 11:17:42 · 262 阅读 · 0 评论 -
第四章 图论(7):欧拉回路、欧拉路径、拓扑排序
目录一、欧拉回路和欧拉路径1.1 铲雪车1.2 欧拉回路1.3 骑马修栅栏1.4单词游戏二、拓扑排序2.1 家谱树2.2 奖金2.3 可达性统计2.4 车站分级一、欧拉回路和欧拉路径欧拉路径就是一条能够不重不漏地经过图上的每一条边的路径,即小学奥数中的一笔画问题,而欧拉回路即起点终点是同一个点的欧拉路径。无向图中,所有边均连通:存在欧拉路径的充要条件:所有点度数为奇数的点只能有0 or 2个。存在欧拉回路的充要条件:所有点度数为奇数的点只能有0个。有向图中,所有边均连通:存在欧拉路径的充原创 2022-05-23 18:08:18 · 515 阅读 · 0 评论 -
第五章 动态规划(1):数字三角形模型
因为第一遍的最优解可能有非常多种方案,你并不能确定采用哪一种。第二遍的最大值依赖于第一遍选择哪种方案,而所有第一遍取最大值的方案数量可能是指数级别的。算法题和传统数学题的坐标系是不一样的,下图是算法题中的坐标。的初始化不同,因为上一个题中三角形的数据有可能是负数,所以最初。,故可以得出结论:商人在走路的过程中不可以走回头路!的初始化,由于状态方程的计算中存在。下面是使用上一个题的写法,一样能过。的路径上的数值和的最大值。这个题的代码和上个题的代码中。的路径上的花生数量最大值。的路线组合的最大值,其中。原创 2022-05-01 20:43:29 · 252 阅读 · 0 评论 -
第五章 动态规划(2):序列 / 线性 DP (LIS、LCS模型)
目录1 最长上升子序列2 最长上升子序列 II (贪心优化)3 最长公共子序列4 最短编辑距离5 编辑距离6 怪盗基德的滑翔翼7 登山8 合唱队形9 友好城市9.1 不相交的线10 最大上升子序列和11 最长递增子序列的个数12 拦截导弹13 导弹防御系统14 最长公共上升子序列(LIS && LCS)15 最大整除子集16 选元素17 正则表达式18 不同骰子序列的数目19 最长ZigZag子序列20 校门外的树1 最长上升子序列ACWing 895Tips: 子序列 ≠ 子串!KM原创 2022-05-02 18:47:04 · 725 阅读 · 0 评论 -
第五章 动态规划(3):背包模型_基础模型
目录一 基础模型1.1 01背包问题1.2 完全背包问题1.3 多重背包问题 I1.4 多重背包问题 II (二进制优化)1.5 多重背包问题 III (单调队列优化)1.6 分组背包1.7 有依赖的背包问题1.8 混合背包问题1.9 二维费用背包问题1.10 背包问题求具体方案(字典序最小的方案数)1.11 背包问题求方案数(最大价值的方案数)背包问题时间复杂度DP时间复杂度 = 状态数量 x 转移的计算量一 基础模型010101 背包问题:每件物品只有一个,故每件物品最多只能用一次,即被称原创 2022-05-03 17:51:36 · 1251 阅读 · 0 评论 -
第五章 动态规划(3):背包模型_经典例题
目录二、经典例题2.1、01背包问题——采药二、经典例题2.1、01背包问题——采药ACwing 423#include <iostream>#include <algorithm>using namespace std;const int N = 1010;int n, m;int f[N];int main(){ cin >> m >> n; for (int i = 0; i < n; i ++ )原创 2022-05-04 17:59:52 · 635 阅读 · 0 评论 -
第五章 动态规划(4):状态机模型
目录1、大盗阿福2、股票买卖 IV3、股票买卖 V4、设计密码5、修复DNA1、大盗阿福ACwing 1049按照之前集合的思路:集合f[i]:表示抢劫前i家店铺所获得的的收益集合划分左边:抢劫第i家店铺,f[i-2]+w[i](因为选择了第i家,第i-1家就不能选择)右边:不抢劫第i家店铺,f[i-1]状态计算f[i] = max(f[i - 2] + w[i], f[i - 1])#include <iostream>using namespace std;原创 2022-05-07 20:13:58 · 464 阅读 · 0 评论 -
第五章 动态规划(5):状态压缩模型
目录1、棋盘式DP / 基于连通性的DP1.1、蒙德里安的梦想(基本模型)(连通性:1X2矩阵)1.2、小国王(连通性:井字形)1.3、玉米田(连通性:十字型)1.4、炮兵阵地(连通性:扩展的十字型)2、集合式DP2.1、最短Hamilton路径(基本模型)2.2、怒的小鸟1、棋盘式DP / 基于连通性的DP1.1、蒙德里安的梦想(基本模型)(连通性:1X2矩阵)ACWing 291算法思想:我们先考虑横向摆放条件下,即仅摆放2x1的方块的时候,总的方案数等于只放横着的小方块的合法方案数。因为所有原创 2022-05-08 17:41:47 · 514 阅读 · 0 评论 -
第五章 动态规划(6):区间DP模型
以最后一次合并的分界线来分类,因为最后一次一定是两个集合合并。考虑一种随机情况,当多边形被划分成如下情况时候,又因为题目中有“下面是不化简解决问题的过程。个长度的区间中的最大值即可(环形的处理跟上一题思路一样)。这个多边形划分成若干个三角形的方案数的价值的最小值。,那么在计算最终最小代价之前的一步的最小代价为。这段石子合并成一堆石子的合并方式的价值最大值。的和(最后一步的代价是固定的)。合并为一个矩阵(珠子)的方式的价值的最大值。,整个的最小值就是三个部分的最小值求和。,即每一部分的平方和的最小值即可。原创 2022-05-08 20:50:24 · 434 阅读 · 0 评论 -
第五章 动态规划(7):树形DP模型
文章目录七、树形DP1、没有上司的舞会2、树的最长路径 / 树的直径3、树的中心4、数字转换5、二叉苹果树(有依赖背包的特殊情况)6、战略游戏7、皇宫看守七、树形DP1、没有上司的舞会ACWing 285#mermaid-svg-TkApwUtdMP3aqhhl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TkApwUtdMP3aqhhl .error-icon原创 2022-05-09 20:28:18 · 356 阅读 · 0 评论 -
第五章 动态规划(8):数位DP模型
目录1、计数问题2、度的数量数位DP技巧:[XX, Y] → f(Y) - f(X - 1),比如计数问题;利用树的角度考虑,比如度的数量1、计数问题ACWing 338算法思路:一定要分情况讨论首先,题目要求在[a, b]中0 ~ 9这10个数中分别出现的次数,那么我们先实现一个函数count(n, x):求出从 1 ~ n 中 x 出现的次数,则在[a, b]中x出现的次数表示为cout(b, x) - count(a-1, x)(类似于前缀和)。对count(n, x)函数,例如当原创 2022-05-11 18:32:15 · 433 阅读 · 0 评论 -
第五章 动态规划(9):单调队列优化DP
目录1、最大子序和2、旅行问题3、修剪草坪4、 烽火传递5、绿色通道6、理想的正方形1、最大子序和ACwing 135集合f[i]:表示以i为右端点,长度不超过m的连续子区间的区间总和最大集合划分以i的取值来划分。即i=0,1,...,k,...ni = {0, 1, ..., k, ... n}i=0,1,...,k,...n,求每一类的最大值,然后取一个整体的最大值即可。若以i=ki = ki=k的时候,f(k)f(k)f(k)表示以A[k]A[k]A[k]结尾的,长度不超过mmm的连续子原创 2022-05-12 18:28:02 · 194 阅读 · 0 评论 -
第五章 动态规划 (10):斜率优化DP
目录1、任务安排 I2、任务安排 II3、任务安排 III4、运输小猫1、任务安排 IACwing 300由于每次的启动消耗的时间会对后面的所有任务都产生影响,所以在进行当前组任务时先将启动产生的影响累加到当前组别中,方便于计算后面的状态。集合f[i]f[i]f[i]:表示将前 iii 个任务分批执行的最小费用集合划分以 iii 结尾的该批次任务的开头进行划分。上面一个批次结尾为 j∈[0,i−1]j \in[0,i-1]j∈[0,i−1],从 j+1 ij+1~ij+1原创 2022-05-13 23:02:47 · 183 阅读 · 0 评论 -
第五章 动态规划(11):计数DP模型、记忆化搜索模型
我们在计算的时候不能是环形,即图是拓扑图。因为题中要求后一个状态的高度要小于前一个状态的高度,所以一定不存在环。下面代码实现过程中使用了完全背包问题的一维状态表示,,每种物品的数量不限,求恰好装满背包的方案数。个物品,每个物品的体积分别是。开始滑的路径长度的最大值。按上一个格子滑到当前格子。,使其总体积恰好等于。,其方案数就等价于从。原创 2022-05-09 21:01:48 · 330 阅读 · 0 评论 -
第六章 数学(一)
目录一、数论1 质数1.1 判定质数——试除法1.2 分解质因数——试除法1.3 筛质数2 约数3 欧拉函数4 快速幂5 扩展欧几里得算法6 中国剩余定理二、高斯消元三、组合计数四、简单博弈论一、数论1 质数定义: 在所有大于1的自然数,如果只包含1和本身这两个约数,就被称为质数,或者叫做素数。1.1 判定质数——试除法ACWing 866时间复杂度: O(sqrt(n))方法一:定义法bool is_prime(int n){ if (n < 2) return false原创 2022-04-05 17:33:43 · 283 阅读 · 0 评论 -
第六章 数学(二)
互质:公因数只有111的两个非零自然数,叫做互质数。欧拉函数的定义:1∼N1∼N1∼N中与NNN互质的数的个数被称为欧拉函数,记为ϕ(N)\phi(N)ϕ(N)。由算数基本定理中,N=P1α1⋅P2α2⋅⋅⋅PkαkN = P_1^{\alpha_1}·P_2^{\alpha_2}···P_k^{\alpha_k}N=P1α1⋅P2α2⋅⋅⋅Pkαk,则ϕ(N)=N×P1−1P1×P2−1P2×...×Pk−1Pk\phi(N) = N \times \frac{P_1 - 1}{P_1} \t原创 2022-06-23 17:41:49 · 326 阅读 · 0 评论 -
第六章 数学(三)
ACwing 885排列组合公式Cab=a!b!(a−b)!\mathrm{C}_a^b = \frac{a!}{b!(a-b)!}Cab=b!(a−b)!a!因为a, b∈[1,2000]a,\space b \in[1, 2000]a, b∈[1,2000],所以不同的方案数为max(a×b)=4×106max(a \times b) = 4 \times 10^6max(a×b)=4×106种,因此可以直接递推处理Cab\mathrm{C}_a^bCab的值。递推式为Cab=Ca−1b+Ca−原创 2022-06-18 15:39:58 · 598 阅读 · 0 评论 -
第六章 数学(四)
假设有三个圆如图重叠,使用SiS_iSi表示三个圆的面积,那么整个图的面积为S= S1+S2+S3−S1∩S2−S1∩S3−S2∩S3+S1∩S2∩S3\begin{aligned}S = \space&S_1 + S_2 + S_3\\& - S_1 \cap S_2 - S_1 \cap S_3 - S_2 \cap S_3 \\& + S_1 \cap S_2 \cap S_3\\\end{aligned}S= S1+S2+S3−S1∩S2−S1∩S3−S2∩S3+原创 2022-06-22 18:12:49 · 470 阅读 · 0 评论 -
第六章 数学_提高篇
代码】第六章数学_提高篇。原创 2022-07-26 10:48:33 · 67 阅读 · 0 评论