算法
文章平均质量分 91
记录学习中遇到的一些常用的算法
IGP9
努力做出好玩的游戏
展开
-
240504-关于买卖股票问题的解法
思路:在前面的基础上更改第1个状态转移方程即可。优化:空间复杂度可以降低为o(1)优化:空间复杂度降低到o(k)补一版记忆化搜索的代码。原创 2024-05-04 14:49:08 · 1204 阅读 · 0 评论 -
数学知识——组合数
数学知识——组合数组合数I(n<=10000, a,b<=2000 mod p)组合数II(n<=1000,a,b<=105 mod p)组合数III(n<=20, a,b<=1018, mod p)组合数IV(a,b<=5000)满足条件的01序列AcWing 885. 求组合数 I核心思路:预处理、动态规划o(n2)从a个数中选b个数的所有方案可以分为两类(从a个物品中任选一个设为x):选出的b个物品包含x:c[a-1][b-原创 2020-11-04 09:57:36 · 313 阅读 · 0 评论 -
数学知识——质数、约数
数学知识——质数、约数质数试除法判定质数分解质因数筛质数约数试除法求约数约数个数约数之和最大公约数质数AcWing 866. 试除法判定质数#include<iostream>using namespace std;int n;bool check(int x){ if(x < 2)return false; for(int i = 2; i <= x / i; i++) if(x % i ==原创 2020-11-04 09:56:27 · 381 阅读 · 0 评论 -
数学知识——欧拉函数、快速幂、龟速乘法
数学知识——欧拉函数、快速幂欧拉函数欧拉函数筛法求欧拉函数快速幂快速幂快速幂求逆元龟速乘法欧拉函数欧拉函数定义:1 ~ N 中与 N 互质的数的个数被称为欧拉函数,记为ϕ(N)。若在算数基本定理中,N=p1a1p2a2…pnan,则ϕ(N)= N * p1−1p1\frac{p1-1}{p1}p1p1−1 * p2−1p2\frac{p2-1}{p2}p2p2−1 * … * pn−npn\frac{pn-n}{pn}pnpn−n。AcWing 87原创 2020-11-04 09:56:05 · 201 阅读 · 1 评论 -
数据结构——队列
2020暑假算法复习——队列、单调队列本文主要内容:模拟队列单调队列1 模拟队列主要功能:实现一个具有队列基本功能并能随机访问的模拟队列时间复杂度:队尾插入,队首弹出,判空操作均为o(1)基本思路:利用一个数组q[]存放队列元素,两个变量tt和hh分别指向队尾和队首元素初始化时tt=-1,hh=0(也可以有其他初始化方式)入队x:q[++tt]=x,出队:++hh,队首:q[hh],若tt>=hh则队列非空,否则为空注意事项:不要忘了tt和原创 2020-11-04 09:54:28 · 152 阅读 · 0 评论 -
数据结构——并查集
2020暑假算法复习——并查集本文作为复习用,持续更新中~1 基础主要功能:查询两个元素是否在一个集合中合并两个集合(单独的一个元素也算一个集合)查询连通块中点的数量时间复杂度:具体问题具体分析基本思路:用一个p数组维护每个节点的父节点,例如x节点的父节点为p[x]利用find函数进行集合查询和路径压缩,例如find(x)返回x的集合每个集合的顶点元素值用来表示该集合合并两个集合可以让其中一个集合顶点x的p[x]等于另一个集合的顶点元素值。因为所有集合的顶点原创 2020-11-04 09:52:38 · 81 阅读 · 0 评论 -
DP——线性DP、区间DP
DP——线性DP最长上升子序列最长公共子序列编辑距离最长上升子序列AcWing 896. 最长上升子序列 II知识点:线性DP、整数二分思路:状态表示:f[i]表示长度为i的所有子序列,值为长度为i的所有子序列末端最小元素(这个所有是对应已经访问的所有数组元素)。状态计算:对于任意序列中的元素x,若f[i]为f[1]~f[len]中(len是当前最长子序列长度)小于x的最大元素,则f[i+1]=x。补充:f[]一定单调递增,可以用反证法去证明可以用整数二分来优化查找原创 2020-11-03 19:42:50 · 248 阅读 · 0 评论 -
字符串比较——KMP
2020暑假算法复习——KMP本文主要内容:基础复习KMP求字符串最小循环节1 基础复习主要功能字符串匹配求字符串最小循环节时间复杂度o(n)基本思路:1.不用kmp算法只要文本串S(长度为n)与搜索串P(长度为m)对应的某一个字符不同,P就往后滑动1位再从头开始比较,用了kmp算法P滑动k位(k>=1 && k < m)从原位置进行比较用一个next[]数组记录P的所有位置的最长匹配前缀(前缀等于后缀的最长前缀)长度,当比较S和原创 2020-11-03 19:41:38 · 222 阅读 · 0 评论 -
数据结构——树状数组
2020暑假算法复习——树状数组本文主要内容:基础复习(单点修改和区间查询)用树状数组实现区间修改和单点查询用树状数组实现区间修改和区间查询将输入数组值作为树状数组下标1 基础复习主要功能:动态实现数组的单点修改和区间查询时间复杂度:单点修改和区间查询都是o(logn)注意事项:变量值的溢出下标从1开始模板题:Acwing1264. 动态求连续区间和1.1 Acwing1264. 动态求连续区间和#include<iostream>原创 2020-11-03 19:40:28 · 113 阅读 · 0 评论 -
数据结构——线段树
2020暑假算法复习——线段树本文主要内容基础复习线段树动态求区间最值线段树动态求区间最大区间和1 基础复习主要功能动态实现单点修改和区间查询时间复杂度单点修改和区间查询的时间复杂度都是o(logn)基本思路:建立一个结构体数组,数组中每个元素维护一段区间(包括两个端点及区间性质),每个结构体元素代表线段树的一个节点。线段树的节点维护一个区间,则将区间分平均为两半,该节点子节点维护左子区间,右子节点维护右子区间。线段树的叶子节点l=r=数组元素下标,代表单原创 2020-11-03 19:39:36 · 100 阅读 · 0 评论 -
DP——状态压缩DP、树形DP
DP——状态压缩DP、树形DP状态压缩DP蒙德里安的梦想最短Hamilton路径树形DP没有上司的舞会状态压缩DPAcWing 291. 蒙德里安的梦想思路:状态压缩:对于每一列的摆放状态,1表示横放(会占据右边邻列同行格子),0表示不横放。对于任意一列,连续0的个数一定要是奇数才满足条件f[i][j]表示前i列中第i列为状态j的方案集合,值为方案个数状态转移条件可以简化为st[i | j] && (i&j)==0&&a原创 2020-11-03 19:38:46 · 154 阅读 · 0 评论 -
DP——计数类DP、数位统计DP
DP——计数类DP、数位统计DP计数类DP整数划分数位统计DP计数问题计数类DPAcWing 900. 整数划分关键思路:对于x的任意一种划分,该划分的数的集合分为两类,一类包含1,一类不包含1。#include<iostream>using namespace std;const int N = 1100, mod = 1e9 + 7;int f[N][N], n;int main(){ cin >> n;原创 2020-11-03 19:44:06 · 342 阅读 · 0 评论 -
DP——背包问题复习
DP——背包问题复习01背包模板题完全背包多重背包分组背包01背包问题AcWing 2. 01背包问题 思路:状态表示:f[i, j]表示从前i个物品中选,体积为j的方案集合,值为所有方案价值的最大值。状态计算:对于第i个物品只有两种操作,选or不选,所以状态f[i, j]只能有f[i-1, j-vi] + wi和f[i-1,j]两种状态转移而来。转移方程:f[i][j] = max(f[i - 1][j], f[i - 1][j - vi] + wi &&原创 2020-10-30 14:09:34 · 80 阅读 · 0 评论 -
贪心复习
贪心复习区间问题区间选点最大不相交区间数量区间覆盖区间分组Huffman树排序不等式绝对值不等式推公式本文主要部分参考了Acwing算法基础课,详情可以去看看。区间问题AcWing 905. 区间选点知识点:排序+贪心思路:将所有区间按照左端点从左到右排序从右向左遍历所有区间,若当前区间不包含点,则选取当前区间左端点(因为这样能使更多区间包含该点,体现了贪心的思想)#include<iostream>#include<al原创 2020-10-30 14:08:06 · 82 阅读 · 0 评论 -
搜索——bfs
2020暑假算法学习(3)——bfs本文主要内容:基础复习利用bfs进行拓扑排序多源bfs1 bfs基础主要功能:求边权相等的图的单源最短路层序遍历注意事项:队列元素类型的确定判断状态数组更新的位置是在弹出队头时还是在将新元素加入队列时(取决于队列是否允许存在重复元素)模板题1:Acwing844. 走迷宫#include<iostream>#include<queue>using namespace std;cons原创 2020-10-30 14:07:03 · 212 阅读 · 0 评论 -
图论——二分图
算法复习(3)——二分图本文主要内容:染色法判断二分图匈牙利算法求二分图的最大匹配1 染色法判断二分图时间复杂度:o(n + m)(n为节点数、m为边数)基本思路:没有染色的点去dfs染色,该点所在连通图是二分图则dfs返回true,否则返回false,任何图统一从某种颜色开始染色在dfs函数中遍历与当前节点相邻的所有节点,若相邻节点没被染色则继续dfs,否则判断当前节点和相邻节点的颜色是否冲突模板题:Acwing 860. 染色法判定二分图#include<原创 2020-10-30 14:06:22 · 145 阅读 · 0 评论 -
图论——最小生成树
算法复习(3)——最小生成树本文主要内容:Prime算法求最小生成树Kruskal算法求最小生成树1 Prime算法求最小生成树时间复杂度:o(n2)基本思路:维护一个最小生成树集合在集合外找一个距离集合最近的点加入集合,用该点更新其他所有点到集合的距离原理同Dijkstra算法类似,堆优化也同Dijkstra算法的堆优化类似模板题:Acwing858. Prim算法求最小生成树#include<iostream>#include<cstri原创 2020-10-30 14:05:26 · 90 阅读 · 0 评论 -
图论——最短路
2020暑假算法复习(3)——最短路原创 2020-10-30 14:04:36 · 220 阅读 · 0 评论 -
数据结构——trie树
2020暑假算法复习——trie树本文主要内容:基础复习文章不定期更新中~1 基础复习主要功能:模拟STL中的set,查询一个集合中是否有字符串x,字符串x的数量,将一个字符串串x插入集合等。时间复杂度:插入和查询o(n)基本思路:用个二维数组son[N][M]来模拟二维链表,数组第一维下标表示地址,第二维下标表示字符映射,N不超过所有字符串字符个数之和、M不超过字符种类数遍历字符串,若当前地址p的当前字符的映射k的son[p][k]已经链向另外一个地址,则原创 2020-10-30 14:03:20 · 112 阅读 · 0 评论 -
搜索——dfs
2020暑假算法复习三——dfs原创 2020-10-30 14:02:21 · 78 阅读 · 0 评论 -
基础算法——哈希表
2020暑假算法复习——哈希表本文主要内容:基础复习拉链法蹲坑法(开放寻址法)拓展持续更新中~1 基础复习主要功能:模拟set,往集合中插入一个数字,查询这个数字是否在集合中出现过模板题:Acwing840. 模拟散列表、Acwing841. 字符串哈希1.1 Acwing840. 模拟散列表方法1:拉链法思路:用一个邻接表来存储集合中所有数。插入时对于每一个数x计算其mod N的余数k作为表头,将其插入邻接表表头位置(头插法)原创 2020-10-30 14:01:11 · 104 阅读 · 0 评论 -
数据结构——栈、单调栈
2020暑假算法复习——栈、单调栈本文主要内容包括:(持续更新中~)模拟栈单调栈1 模拟栈主要功能:实现一个具备栈的功能且支持随机访问的模拟栈时间复杂度:插入、弹出、判空都是o(1)基本思路:创建一个数组stack[]作为栈容器,变量top指向栈顶初始化top=-1,因为开始时栈为空(栈从位置0开始存元素)元素入栈stack[++top],出栈—top,判断栈是否为空转换为判断top是否非负注意事项:注意top的初始化例题:1.模拟题:A原创 2020-07-21 17:06:22 · 175 阅读 · 0 评论 -
基础算法——离散化
本文简单介绍了离散化的原理及实现方法原创 2020-07-13 13:02:22 · 1955 阅读 · 0 评论 -
基础算法——前缀和与差分
一维前缀和二维前缀和一维差分二维差分原创 2020-07-13 10:48:20 · 245 阅读 · 0 评论 -
基础算法——高精度
高精度加法高精度减法高精度乘法(高精度乘低精度、高精度乘高精度)高精度除法(高精度除以低精度)原创 2020-07-12 13:17:29 · 723 阅读 · 0 评论 -
基础算法——二分
手动实现二分(手动档 )用lower_bound与upper_bound函数实现二分(自动档 )原创 2020-07-11 18:33:15 · 238 阅读 · 0 评论 -
基础算法——用递归实现枚举
1. 1~n的排列型枚举2. 1~n的组合型枚举3. 1~n的指数型枚举4. 关于有重复元素时枚举的思考原创 2020-07-11 17:19:03 · 1339 阅读 · 0 评论 -
240505-基础算法-排序【未完待续】
十个内部排序算法原创 2020-07-11 16:57:35 · 166 阅读 · 1 评论