![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习
文章平均质量分 72
姜九笙561
摆烂人生
展开
-
2024/3/19打卡三国游戏(14届蓝桥杯省赛)——贪心+枚举
这个思路主要就是贪心(太菜了,证明不了),最后选择事件就是对三种情况所有计算出的剩余兵力的枚举,最多选择多少个可以满足条件。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X,Y,Z 增加 Ai,Bi,Ci。注意,蓝桥杯官方给出的关于 Ai,Bi,Ci 的数据范围是 1≤Ai,Bi,Ci≤10^9,但是这与给出的输入样例相矛盾,因此予以纠正。意思是,每个国家都可以随意挑选事件,之间相互独立,没有制约,只是都在追求让自己国家的兵力更多。原创 2024-03-20 09:00:00 · 1107 阅读 · 0 评论 -
全排列——dfs(剪枝/回溯)
我们可以假设我们有一个 n 的长度的空格,我们对每个位置进行选取序列中的值进行枚举,枚举到第 i 个空位时,前 i-1 个值被使用过的值标记成不可使用。枚举完一次后,向前回溯。回溯法:我们定义递归函数表示当前排列为,下一个待填入的位置是第个位置(下标从 0 开始)。那么整个递归函数分为两个情况:如果,说明我们已经填完了 n 个位置,找到了一个可行的解,我们将放入答案数组中,递归结束。如果,我们要考虑第个位置填哪个数。原创 2024-03-17 17:20:16 · 706 阅读 · 0 评论 -
2024/3/13打卡壁画——思维!!!+前缀和***
使用 × 表示被摧毁, √ 表示被作画。那么每天的过程就是 √ × √ × √ × √ × ...那么至少有块可以被用来作画。那如果 n 是奇数,在每天作画和摧毁交替中使用过的墙壁总个数一直是保持偶数的。那么最后一块墙壁一定是被用来作画的,作完画后,没有墙壁可以被摧毁。因此,能够被作画的墙壁的个数为。那么最后的形式一定是,中间连续一段被作画,两边的墙壁全被毁掉了。原创 2024-03-13 15:26:37 · 1044 阅读 · 0 评论 -
区间合并算法
例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。[1,6] 和 [2,3] 可以合并为一个区间 [1,6]。[1,3] 和 [5,6] 就不能合并为一个区间。原创 2024-03-11 19:02:50 · 553 阅读 · 0 评论 -
2024/3/9d打卡整数划分---背包动态规划方式,计数类动态规划
一个正整数 n 可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中 n1≥n2≥…现在给定一个正整数 n,请你求出 n 共有多少种不同的划分方法。由于答案可能很大,输出结果请对 10^9+7 取模。,并且物品的数目不限。因此可以转化为完全背包问题。我们将这样的一种表示称为正整数 n 的一种划分。共一行,包含一个整数,表示总划分数量。(从最后状态转移方差可以看出,方程与。无关,因此可以优化成一维)共一行,包含一个整数 n。那么i可以划分的总和为从。原创 2024-03-09 20:37:54 · 561 阅读 · 0 评论 -
石子合并---区间动态规划问题
那么只需要确定中的分界点,从而确定合并左边石子和右边石子的代价,那么只需要求出分别合并左边石子以及合并右边石子的代价最小值。分界点可以从枚举到(分界点包含在左边石子中)。原创 2024-03-09 00:38:13 · 400 阅读 · 0 评论 -
公共子序列---动态规划问题
给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。第一行包含两个整数 N 和 M。第二行包含一个长度为 N 的字符串,表示字符串 A。第三行包含一个长度为 M 的字符串,表示字符串 B。字符串均由小写字母构成。输出一个整数,表示最大长度。原创 2024-03-07 18:26:54 · 478 阅读 · 0 评论 -
最短编辑距离---线性DP
现在请你求出,将 A 变为 B 至少需要进行多少次操作。第一行包含整数 n,表示字符串 A 的长度。第二行包含一个长度为 n 的字符串 A。第三行包含整数 m,表示字符串 B 的长度。第四行包含一个长度为 m 的字符串 B。字符串中均只包含大小写字母。输出一个整数,表示最少操作次数。原创 2024-03-06 17:37:11 · 411 阅读 · 0 评论 -
最长上升子序列**----线性DP,贪心,单调栈
因为由于贪心的思想,存在这种替换方式,导致最长上升子序列中某些值被替换掉,但是上升子序列的长度没有发生改变,只有里面的值发生了变化,因此,在求解该题中最长上升子序列的长度时可以被使用,但是要输出最长上升子序列的值的时候,就不行了。核心就是因为栈中储存的不只有一个序列,是旧序列和新序列合并的产物,因此不一定是最终最长上升子序列。原创 2024-03-05 19:25:23 · 1189 阅读 · 1 评论 -
动态规划DP之背包问题4---分组背包问题
01背包: 一种物品只有一件完全背包:一种物品有无限件多重背包:一种物品有有限的个数分组背包:有一组物品,每组物品中只能选一个有 N 组物品和一个容量是 V 的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是,价值是,其中 i 是组号,j 是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。原创 2024-03-04 16:01:38 · 496 阅读 · 0 评论 -
动态规划DP之背包问题3---多重背包问题
01背包是每个物品只有一个,完全背包问题是每个物品有无限个。那么多重背包问题就是。有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。原创 2024-03-04 10:37:22 · 1238 阅读 · 0 评论 -
快速幂(求解原理+例题)
若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得,则称 x 为 b 的模 m 乘法逆元,记为。b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,即为 b 的乘法逆元。原创 2024-03-03 21:45:10 · 1001 阅读 · 0 评论 -
位运算---求n的二进制表示中第k位是1还是0 (lowbit)
lowbit(x):返回x的最右边的1。原创 2024-03-03 21:23:11 · 407 阅读 · 0 评论 -
动态规划DP之背包问题2---完全背包问题
这些状态是问题的解的一部分,它们包含了问题的关键信息,可以帮助我们描述问题的结构,并且可以通过状态之间的转移来推导出最优解。(很多人不理解该状态转移,理解过程如上DP分析所示,从最开始暴力解决开始分析,再依次优化,动态规划问题虽然代码看着简单,但是要理解其中原理和状态转移过程)接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。原创 2024-03-01 16:13:20 · 1387 阅读 · 0 评论 -
动态规划DP之背包问题1---01背包问题
01背包问题通常描述为:有一个背包,它的容量为,现在有种不同的物品,编号为,其中每一种物品的重量为,价值为。问可以向这个背包中装入哪些物品,使得在不超过背包容量的前提下,背包中物品的总价值最大。:在有限的资源下,如何分配资源才能使得收益最大化。比如,在限定的时间、成本和人力资源下,如何选择项目以获得最大的利润。:在物流配送中,如何在有限的运输容量下,选择合适的货物组合,以最大化运输的价值或者利润。:在投资中,如何选择不同的投资组合,使得投资组合的收益最大化。原创 2024-03-01 10:00:00 · 964 阅读 · 0 评论 -
分享一个最短路算法的模版讲解,来自acwing
最短路算法模板原创 2024-02-29 15:04:49 · 380 阅读 · 0 评论 -
博弈论---Nim游戏(公平组合游戏,概念,证明异或为0就是必败态,示例)
游戏使用一堆物品,例如棋子、石头或者硬币,这些物品被分成几堆,每堆可以有任意数量的物品。Nim游戏的关键在于掌握取物品的策略,因为有正确的方法可以确保你获胜,无论对手怎么移动。这个策略涉及到让每一堆物品的数量保持在特定的模式,这样你就可以控制游戏的走向,迫使对手进入必败局面。NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏。给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。原创 2024-02-29 14:59:19 · 2683 阅读 · 0 评论 -
二分图---染色法(判断二分图),匈牙利算法(二分图的最大匹配) //概念,应用场景,判定证明,算法思路,示例
二分图是图论中的一个重要概念,指的是一个图的顶点集可以被分为两个互不相交的子集,并且图中的每条边都连接两个不同子集中的顶点。:在网络流问题中,二分图可以表示一种特殊的流网络,其中顶点集分为源点集和汇点集,边表示从源点到汇点的流量路径,用于建模输送网络中的流量分配和优化问题。:在二分图中,匹配问题是指找到一种边的子集,使得图中每个顶点都与子集中的某条边相邻。二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。原创 2024-02-29 10:00:00 · 1222 阅读 · 0 评论 -
最小生成树---Kruskal算法
给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合。由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。原创 2024-02-27 14:00:50 · 397 阅读 · 0 评论 -
最小生成树---朴素Prim算法,堆优化版Prim算法
给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合。由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中。原创 2024-02-27 13:24:44 · 1352 阅读 · 0 评论 -
最短路问题---朴素Dijkstra算法,堆优化版Dijkstra算法,Bellman-Ford算法,SPFA算法,Floyd算法(算法思路+例题)
处理边权全为1的图。原创 2024-02-22 13:49:46 · 1059 阅读 · 1 评论 -
有向图的拓扑排序---bfs应用
若一个由图中所有点构成的序列A满足:对于图中的每条边(x -> y),x在A中都出现在y之前,则A是一个拓扑序列。原创 2024-02-17 21:11:28 · 496 阅读 · 1 评论 -
并查集(基本原理+示例)
处理图和树的问题。例如:两个元素是否连通,各个连通图的元素总个数,合并两个元素所在的集合。等等还可以维护其他额外信息(带有权重...)。每一个集合用一棵树来表示,树根的编号就是整个集合的编号,每个节点存储父节点信息。(ex:p[x] 表示x的父节点)寻找一切信息的基础都要先找根节点,即集合编号。根节点保存信息。优化:在求集合编号,即向上寻找树根的时候,时间复杂度相当于树的深度。可以使用来减少时间复杂度。即,在寻找根节点的时候,将根节点下面所有的节点的父节点都指向根节点,大大的减少时间。原创 2024-02-01 21:13:21 · 906 阅读 · 1 评论 -
单调栈(思路+示例)
给定一序列,求出该序列中每个数左边离他最近且比他小 / 大的数。单调栈:栈中的数呈单调上升或下降的形式。从头遍历该序列,当遍历到,如果栈顶元素小于,则栈顶元素则为要的值。否则,进行循环:直到小于当前的栈顶为止,并且在循环过程中将大于的栈顶元素弹出。当前的栈顶就是要的值,然后将该遍历到的元素装入当前栈顶。最后,这个栈会形成一个单调上升的序列。给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。原创 2024-01-25 21:43:21 · 335 阅读 · 0 评论 -
基础--数组模拟 单链表,双链表,栈,队列
单链表邻接表(n个单链表);用于存储图和树双链表优化问题。原创 2024-01-25 21:23:21 · 911 阅读 · 0 评论 -
差分——前缀和的逆运算(一维+二维)
给定一个数组,进行多次区间的增加、减少操作。为右下角的子矩阵中所有数。构造一个二维数组数组。原创 2024-01-18 19:29:23 · 375 阅读 · 1 评论 -
前缀和(一维+二维)
(x左边一位的和,加上y上面一位的和,减去重叠的(x-1,y-1)的和)按顺序进行计算的,计算到(x, y)的时候,前面的所有数已经计算过了。(减去左边多的,减去上面多的,加上左上多减的一部分)快速的求出一段序列从。原创 2023-12-31 14:57:47 · 401 阅读 · 1 评论 -
二分查找(算法实质+模板)
给定一个按照升序排列的长度为 n 的整数数组,以及 1 个查询,返回该查询元素 k 的起始位置和终止位置(位置从 0 开始计数)。如果数组中不存在该元素,则返回。中,每次将区间长度缩小一半,当。(题目可能无解,二分一定有解)时,我们就找到了目标值。原创 2023-12-31 00:25:18 · 389 阅读 · 1 评论 -
归并排序算法(算法求解+实际应用+代码)
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i a[j],则其为一个逆序对;(归并排序是分段进行排序,在归并操作完成前,右边数组的所有数是一直保持在左边数组的右边。因此可以通过归并时判断大小时求解)在随机元素,随机数组大小的数组中,找出左边比右边元素小的所有元素之和。给定一个长度为 n的整数数列,请你计算数列中的逆序对的数量。O( nlog(n) ) (logn 层,每层遍历n个)归并排序实质上是一种分治算法。原创 2023-12-26 16:08:09 · 340 阅读 · 0 评论 -
快速排序算法(求解方式+边界问题+代码)
每次比较都需要进行i++或者j--的操作,因此可以设初始 i= l-1 ,j=r+1,每次比较前先进行 i++ 和 j--。同理分界点取 a[r] 或者 a[(l+r+1)/2] 不能用 j,j+1 来作为划分左右两边的值。如果分界点取 a[l] 或者 a[(l+r)/2] 不能用 i-1,i 来作为划分左右两边的值。(ex:2 1 ,分界点值为2的时候)。同理 a[j] 和分界点。如果挑选的分界点碰巧为该数组区间的最大值,i。ex:给一个长为n的数组,使用快速排序对其进行排序。原创 2023-12-26 15:24:46 · 365 阅读 · 1 评论 -
Hash算法
一、理解把任意长度的输入通过散列算法(mod)变换成固定长度的输出,把原有的数映射成一个对应的散列值。散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,可能会造成冲突。二、存储结构 开放寻址法 思路:利用hash函数从hash数组中找到对应 应该存放x的位置(若hash表中已有x,就不用再存)。 解决冲突:当用hash函数求出来的位置上有值,就依次往后查找,找到的第一个空位就是该值的位置,如果找到了数组尾部,就从原创 2022-10-24 10:02:17 · 233 阅读 · 0 评论 -
Tire树
Tire树的理解、应用和例题原创 2022-10-19 21:32:01 · 192 阅读 · 2 评论