- 博客(136)
- 收藏
- 关注
原创 C++数位DP
数位DP,对应蓝桥云课 二进制问题 代码框架见下。代码练习 1 长官和他的猫 蓝桥云课 代码见下。代码练习3 对应蓝桥云课 数数问题 代码见下。代码练习2 幸运年 对应蓝桥云课 代码见下。
2025-12-14 16:33:11
251
原创 C++树形DP(树上分组背包)
树形DP 代码框架见下 对应小明的背包6 蓝桥云课。代码 1 对应蓝桥云课 包含1的树上联通计数块2。代码练习 2 最小子树 代码见下,对应蓝桥云课。代码练习 3 对应蓝桥云课 取气球 代码见下。
2025-12-13 15:05:22
188
原创 C++树形DP(选与不选模型)
代码练习 2 树的着色问题 对应蓝桥云课 代码见下。代码练习 3 对应蓝桥云课 没有上司的舞会 代码见下。代码练习 1 对应蓝桥云课 生命之树。树形DP 代码框架见下。
2025-12-11 15:23:18
117
原创 C++ 小明的背包5
代码练习 1 基德的金币挑战 对应蓝桥云课 代码见下。代码练习 4 火柴棒数字 蓝桥云课 代码见下。代码练习 3 对应蓝桥云课 倒水 代码见下。小明的背包 5 动态规划数组 代码框架。
2025-12-10 11:56:31
213
原创 C++ 进阶动态规划(小明的背包3)
进阶动态规划,对应蓝桥云课小明的背包3 代码框架见下。代码练习 1 对应蓝桥云课 小明的背包4 代码见下。代码练习3 对应蓝桥云课 鲁邦的甜品店 代码见下。代码2 新一的宝藏搜寻加强版 对应蓝桥云课。
2025-12-08 23:20:46
174
原创 C++ 最长单调子序列
代码练习 1 对应蓝桥云课 蓝桥骑士 代码见下。代码练习 2 对应蓝桥云课 合唱队形 代码见下。代码 3 对应蓝桥云课 拍照 代码见下。最长单调子序列 代码框架 代码见下。
2025-12-01 20:17:57
182
原创 C++ 最大子段和(动态规划)
代码练习 4 对应蓝桥云课 可删除数组的最大子数组和 代码见下。代码练习1 对应蓝桥云课 区间最大子序列和 代码见下。代码练习 3 基德的冒险之旅 蓝桥云课 代码见下。最大子段和 对应洛谷P1115 代码见下。
2025-11-30 21:57:48
148
原创 C++ 线段树
C++线段树解决的问题是:优化动态区间求和的问题。降低查询和修改数组操作的时间复杂度,从O(n)降低到O(logn),线段树有三个类型 求和、求最小、求最大。代码练习 1 对应蓝桥云课 单点修改,区间查询 代码见下。代码练习 2,对应蓝桥云课 小蓝的鸡蛋 代码见下。
2025-11-29 12:13:06
783
原创 C++ 稀疏表
C++ 稀疏表的作用是解决静态区间的最值问题,每次询问的时间复杂度可以降到O(1)。代码练习 3 对应蓝桥云课 区间选数k 代码见下。代码练习1 对应蓝桥云课 区间最大值 代码见下。代码练习 2 对应蓝桥云课 附近最小 代码见下。稀疏表框架代码,见下。
2025-11-21 23:08:46
217
原创 C++ 树状数组、单点更新(区间求和)、区间更新(单点求值)
第一种方式:((x ^ x - 1) + 1) >> 1 (使用到异或,右移)C++ 树状数组的lowbit函数:求解lowbit有四种方式。代码练习 2 对应蓝桥云课 三元组个数 代码见下。代码练习 1 逆序对的数量 蓝桥云课 代码见下。C++ 单点更新,区间求和,代码框架见下。C++ 区间更新,单点求值,代码框架见下。第二种方式:x - (x & x-1)第三种方式:x & (~x + 1)C++ 树状数组的求和操作。第四种方式:x & -x。
2025-11-19 23:07:43
208
原创 C++并查集
C++ 并查集 Kruskal 代码框架见下。C++ 并查集:启发式合并,代码框架见下。C++ 并查集:路径压缩 代码框架见下。并查集:朴素算法 代码框架见下。并查集:森林算法 代码框架见下。
2025-11-07 20:28:50
154
原创 C++ 二叉堆
二叉堆元素插入:1,往数组尾部插入一个元素。2,对插入的元素,比较他在树形结构中,和他的父节点的大小关系,来决定是否和父节点进行交换。二叉堆删除元素:1,把数组的第0个元素和最后一个元素交换。2,删除数组的最后一个元素。3,对堆顶元素做下沉操作直到再次满足堆的性质。二叉堆获取堆顶元素:返回数组的第0个元素,时间复杂度为o(1)代码练习 3 对应蓝桥云课 一道简单的取模问题 代码见下。代码练习 1 对应蓝桥云课 小蓝的最大集合 代码见下。代码 2 对应蓝桥云课 第k大的数,代码见下。二叉堆是一个完全二叉树。
2025-11-04 23:16:38
178
原创 C++ 单调队列
单调队列:先进先出,是一个双端队列,队首只能删除元素,队尾可以进行插入和删除。代码练习2 对应蓝桥云课 MAX最值差 代码见下。代码练习1 对应洛谷 滑动窗口 代码见下。
2025-10-30 22:22:27
190
原创 C++ 单调栈
代码练习 1,伦太郎的等待,对应蓝桥云课 代码见下。代码练习2 对应蓝桥云课 百亿富翁 代码见下。代码练习3 对应蓝桥云课 最大区间 代码见下。
2025-10-29 23:37:55
219
原创 C++ 链式前向星
e = {to, weight, head[from]} //第一个参数是这条边的终点,第二个参数是权重,第三个是这条边 // 在边链表中下一条边的下标。链式前向星结合了数组和链表的特性,通过数组来存储边的信息,通过链表来连接各个顶点.代码练习 金苹果群岛的建设 蓝桥云课 代码见下。
2025-10-26 16:50:52
180
原创 C++ 双向循环链表
双向循环链表:头插法,先创建一个节点,将节点的prev指向虚拟头结点,将节点的next指向虚拟头结点的下一个节点,最后将对应节点的指针指向对应位置。尾插法,先创建一个节点,将节点的prev指向虚拟头结点的prev所指向的指针,将节点的next指针指向虚拟头结点,最后将对应节点的指针指向对应位置。任意插,找到需要插入的指针后,新节点的prev指向插入节点位置的节点,新节点next指向插入节点位置的下一个节点,最后将节点的指针分别指向对应位置。代码练习1 对应蓝桥云课 小王子双链表 代码见下。
2025-10-22 23:12:56
161
原创 C++ 高精度加法、减法、乘法、除法,代码框架
12 | 9 8 7 6 这里的话,按照位次依次枚举每一位数字,枚举的数量便是 10*对应位数,也就是被除数的位数。得到最终的结果,完成了加法:1234567+999765463=1001000030。到了第二步,000 - 1 - 999 = -1000,然后高位继续借1,得到000。002+999=1001 第三步进位1到第四位,将000+1=001。到了第三步,001 - 1 = 000, 可以得到最终的结果。第一步,需要借位,因为原本的000 - 001 = -1,
2025-10-19 15:58:01
382
原创 C++ 完全背包时间优化、完全背包空间优化
至少放一个的话,我们尝试在“前i个物品放满一个容量为j的背包”,拿到一个物品,即前i种物品放满一个容量为j-c[i]的背包,这个时候便是dp[i][j-c[i]] + w[i]状态转移方程:dp[i][j] = max(dp[i-1][j], dp[i][j - c[i]] + w[i])一个都不放,就是前i-1种物品放满一个容量为j的背包,是dp[i-1][j]对于第i个物品,其实有两种选择,一个都不放,至少放一个。代码练习 1 对应蓝桥云课 小明的背包2 代码见下。代码练习2 对应力扣硬币 代码见下。
2025-10-12 19:55:30
333
原创 C++ 完全背包
第二步,状态转移方程,dp[i][j] = max(dp[i-1][j-k*c[i]] + k*w[i]) (0 =< k =< j/c[i]),如果“第i个物品不放入容量为j的背包”,那么转态转化为求“前i-1种物品放入容量为j的背包”的问题;由于不放,所以最大价值就等于“前i-1个物品放入容量为j-c[i]*k的背包”的最大价值加上放入k个第i种物品的价值,即dp[i-1][j-k*c[i]] + k*w[i]。完全背包是01背包的拓展,区别是他可以取0件,1件,,,k件,而01背白只能去0件,1件。
2025-10-12 17:29:39
346
原创 C++ 01背包
如果第i个物品放入容量为j的背包,那么问题转化为求前i-1个物品放入容量为j的背包,那么此时,所以最大价值等于“前i-1个物品放入容量为j-c[i]的最大背包”+放入第i个物品的价值,即dp[i-1][j-c[i]] + w[i]。dp[i][j] = max(不放, 放)1 状态设计,状态(i,j)表示前i个物品恰好放入容量为j的背包(i属于[0, n], j属于[0, m]),令dp[i][j]表示状态(i,j)下该背包得到的最大价值,即前i个物品恰好放入容量为j的背包所得到的最大价值。
2025-10-11 09:44:40
580
原创 C++ 记忆化搜索
他的基本思想是利用缓存来存储已经计算过的子问题的结果,以便在后续计算过程中直接获取,避免重复计算。2 编码方便,相比于动态规划来说,不需要关注子问题的枚举顺序问题,也不用管数组的下标越界问题,只需要按照深度优先搜索的思路,把代码框架写好,再加入记忆化部分的代码即可。5 递归计算结果并返回:这一步就是深度优先搜索的递归过程,也是递归子问题取最优解的过程,根据状态转移方程来执行递归调用。2 合法性剪枝:因为在递归计算的时候,我们必须保证输入参数的合法性,所以这一步是必要的,比如坐标之类负数的判断。
2025-09-28 18:56:45
295
原创 C++ 拓扑排序
如果结果列表的元素个数为n,说明不存在环;输出结果列表,否则输出-1,代表存在环,不存在这样一种排列。时间复杂度为o(n+m),n是顶点数量,m为边数量。代码练习2,对应蓝桥云课 阿霖的旅游计划,代码见下。代码练习3 对应蓝桥云课 恋爱通关游戏 代码见下。代码练习 1 对应蓝桥云课,走多远 代码见下。2 选择一个入度为0的顶点u放入结果列表。3 删除顶点u和它所有的出边,更新入度。1 统计每个节点的入度。4 回到2 迭代计算。
2025-09-25 23:16:17
477
原创 C++ 线性DP
4 状态转移的过程一定是单向的,把每个状态理解成一个节点,状态转移理解成边,动态规划的求解就是在一个有向无环图上进行递推计算。1 问题求什么,状态就尽量定义成什么,有了状态,再去尽力套状态转移方程。3 状态转移方程中的i变量导致数组下标越界,从而确定那些状态是初始状态。2 动态规划的时间复杂度等于:状态数 X 状态转移 的消耗。代码练习 1 对应蓝桥云课 接龙序列 代码见下。代码练习 2 对应蓝桥云课 数组切分 代码见下。2 利用循环和状态转移方程,填充状态。对应蓝桥云课,最大魅力值,代码见下。
2025-09-20 17:37:26
247
原创 C++ 最短路SPFA
(2)然后判断v在不在队列中,如果不在就将v放入队列中。这样不断从队列中取出结点来进行松弛操作,直到队列为空为止。对于图 G = <V, E>,源点为s,d[i]表示s到i的最短路。代码练习 2 对应蓝桥云课 地铁最短路径与最少换乘。SPFA的最长时间复杂度为km,k为常数,m为边数。第一步,定义边的数据结构 Edge(v, w)代码练习,对应蓝桥云课 路径 代码见下。第四步,SPFA框架代码。第五步,SPFA初始化。第六步,实现松弛操作。
2025-09-14 22:23:49
335
原创 C++ Dijkstra堆优化算法
第二步,辅助数组,对于图G = <V, E>,源点为s,dist[i]表示s到i的最短路,visited[i] 表示dist[i]是否已经确定(布尔值),即s到i的最短路,是否已经确定。第一步,建图,任何算法我们都要去思考,用什么数据结构来存储,这个算法我们采用邻接表来存储,有时候输入数据,并不是我们期待的那样,所以需要对图进行一些处理,这就是建图的过程。第三步,辅助堆,利用一个小顶堆heap存放二元组(v, dist[v]),小顶堆扮演的是优先队列作用,dist[v]值越小的,会从优先队列中优先出列。
2025-09-12 21:03:42
1025
原创 C++ 最短全源路floyd-warshall
第三步,状态转移,令d[k][i][j] 只允许结点[0, k) 作为中间结点的情况下,i到j的最短路,【不包含k】如果最短路不经过k点,则d[k][i][j] = d[k-1][i][j]i->j 无边 d[0][i][j] = inf。第五步,空间优化,d[i][j] = min(d[i][j], d[i][k] + d[k][j]) (0=< i j < n, 1 =< k =< n)算法步骤:第一步,设计状态,令d[k][i][j] 为只允许结点[n, k)作为中间点的情况下,i到j的最短路。
2025-09-07 11:47:13
359
原创 C++ Bellman-Ford算法
算法原理:算法同样利用了最短路的最优子结构性质,用d[i]表示起点s到i的最短路,那么边数上限为j的最短路可以通过边数上限为j-1的最短路加入一条边得到,通过n-1次迭代,最后求得s到所有点的最短路。这个算法并没有考虑负权圈的问题,如果存在负权圈的话,那么第二步操作的更新就会没有止境,所以判定负权圈的算法就出来了,只需要在第n次继续进行第二步的松弛操作,如果至少有一条边被更新,则肯定存在负权圈。时间复杂度,每次松弛操作都需要遍历所有的边,边数为m,最多遍历n次,所以总的时间复杂度为o(mn)
2025-09-01 22:45:38
618
原创 C++广度优先搜索
第一步,初始化数据结构,广搜在计算过程中,需要利用一个哈希表visited和一个队列queue来记录当前访问过的节点,其中哈希表是为了快速查找某个节点是否被访问,并且执行插入,队列是为了记录顶点的访问顺序.第三步,顶点访问,如果队列不为空,弹出一个队列首元素u,继续访问和u相邻的顶点v,如果v不在哈希表中,则在哈希表中标记掉v,并且把v插入到队列中,直到队列为空,搜索结束。第二步,起点入队,先把起点s插入队列中,并且在哈希表中把起点s标记掉。代码练习2,对应力扣,钥匙和房间,代码见下。
2025-08-30 12:13:26
221
原创 C++深度优先搜素
算法描述,第一步,初始化数据结构,全排列在计算过程中,需要利用一个哈希表visited和一个栈stack来记录当前访问过的节点。第二步,顶点访问,依次访问所有顶点,如果发现这个顶点没有在哈希表中,则把它插入哈希表,并且把这个顶点入栈。这样一来,哈希表和栈中,存储的就是本次遍历中存储的点。第四步,当本次访问的顶点数等于总顶点数的时候,栈中的元素就代表一个排列,把排列进行输出或者做其他相应的处理。第五步,回溯,当没有任何顶点需要访问的时候,进行回溯。第三步,递归调用,利用递归进行调用自身,继续访问下一个节点。
2025-08-25 22:22:12
192
原创 C++最小生成树
第二步,辅助数组,对于图G=<V, E>,源点为0(为什么),dist[i]表示顶点i与已生成的最小生成树之间的最小距离,visited[i]表示dist[i]是否已经确定,即i所在的最小生成数的边是否确定。第四步,找边权最小的点,从所有visited[i]为false的点中找到一个dist[i]值最小的,令x=i,并且找到visited[x]标记为true,如果找不到,算法结束。第五步,统计边权和,将当前找到的最小边权dist[x]累加到sum上,并且标记visited[x]为true。
2025-08-18 20:37:14
1011
原创 C++ 最短路Dijkstra
第二步辅助数组,对于图G=[V, E],源点为s,dist[i] 表示s到i的最短路径,visited[i]表示dist[i]是否确定(布尔值),即s到i的最短路径,是否已确定。第四步找距离最小的点,从所有的visited[i]为false的顶点中找到一个dist[i]值最小的,令x=i,并且标记visited[x]为true,如果找不到,算法结束。第五步更新其余点的距离,更新从x出发的,到达顶点y的最小距离为dist[y],dist[y] = min(dist[y], dist[x]+w(x,y))
2025-08-16 19:13:00
967
原创 C++ 滑动窗口、二分查找
第四步是记录最优解,在迭代窗口【i,j】的过程中,记录最优区间或者满足条件的区间方案数,并且最终返回答案即可。第三步是控制左游标,根据题目条件进行判定,如果发现条件不满足,则扩大左游标i的值,也就是让i变成i+1。第二步是控制右游标,固定左游标i,当右游标j小于n-1的时候,扩大右游标j的值,也就是让j变成j+1。滑动窗口算法第一步初始化游标,初始化游标i和j,其中i为0,j为-1,代表一开始是一个空窗口。代码,对应蓝桥云课 全部都有的子序列 代码见下。代码练习,对应力扣,搜索插入位置,代码见下。
2025-08-14 22:31:42
520
原创 C++ 前缀和、双指针
分离双指针:两个指针分别属于不同的数组(或链表),两个指针分别在两个数组(或链表)中移动,从而解决相关算法问题,常见应用,有序数组合并,归并排序中的合并部分,对两数组求交集和并集。对撞指针:是指两个指针,分别指向序列的第一个元素和最后一个元素,然后指针相向移动,一个指针递增一个指针递减,直到两个指针值相撞或者满足其他特殊条件为止。快慢指针:就是两个指针,从同一侧开始遍历序列,移动步长一个快一个慢。代码练习,对应蓝桥云课 反转字符串中的字符,代码见下。代码练习,对应力扣,寻找数组的中心下标,代码见下。
2025-08-01 22:23:04
537
原创 C++ 哈希算法、贪心算法
算法:遍历这n个数,对于遍历到的第i个数x,计算出以下数字 y = h[x - 1] + h[x + 1]直接累加到计数器c上(因为h[x]代表x的出现次数),把当前遍历到的x这个数,执行以下操作,h[x] = h[x] + 1,代表增加x的计数。为了解决上述提到的缺点,会采取取模等方式,也会出现哈希冲突等情况,也会有对应的哈希冲突解决方案。哈希算法:辅助数组h[1001], h[x]代表x出现的次数,整数技术器c。代码练习,对应蓝桥云课 分开元音字母,代码见下。代码练习三,对应蓝桥,优质数对,代码见下。
2025-07-28 21:34:16
1071
2
原创 C++ 桶排序、基数排序、堆排序
算法思想:1 设置固定数量的空桶 2 把数据放到对应桶中 3 对每个不为空的桶中数据进行排序 4 拼接不为空的桶中数据,得到结果。算法的优点:适用于一定范围内的整数或浮点数排序,不需要比较元素之间的大小,因此排序速度较快,桶排序是一种稳定的排序算法。元素插入:往数组尾部插入一个元素,对插入的元素,比较它在树形结构中与父节点的大小关系,来决定是否和父节点进行交换。基数排序优点:不需要进行元素间的比较,因此对于一些特定的情况,可以很容易的排序具有固定宽度的数字序列。关于堆排序的相关代码分析。
2025-07-20 21:34:01
406
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅