自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 收藏
  • 关注

原创 动态规划——状态压缩dp

acwing91.最短hamilton路径。acwing291.蒙德里安的梦想。

2024-04-20 21:24:01 222 1

原创 动态规划——数位统计dp

acwing338.计数问题。

2024-04-20 17:00:22 205

原创 动态规划——树型dp

acwing285.没有上司的舞会。

2024-04-18 23:16:04 158

原创 动态规划——记忆化搜索

发现从上面往下一步步走很麻烦,直接搜索肯定超时,我们可以逆向求解。从倒数第二行开始看,2可以选4和5,因为找最大,所以我们选5,把2加上5更新为7,以此类推,倒数第二行被更新为7,12,10、10。依次更新到第一行,第一行的数字就是答案。acwing901.滑雪。

2024-04-18 20:53:02 229

原创 数学知识——欧几里得算法(辗转相除法)

数论、欧几里得

2024-04-12 18:19:46 162

原创 基础算法——位运算

数字在计算机中以补码形式来储存 - x = ( ~ x + 1)合并起来:n >> k & 1。(2):看个位是几(x & 1)步骤:(1):先把第k位移到最后一位(n >> k)二、lowbit:返回x的最后一位1。如:10101000 返回 1000。一、n的二进制表示中第k位是几。操作:x & - x。

2024-04-11 23:22:19 163

原创 基础算法——二分

当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。也就是说,当看到r = mid时,计算mid不用+1。当看到l = mid时,计算mid需要+1。

2024-04-08 16:39:44 216

原创 动态规划——线性dp

最长严格上升子序列(二分优化)(时间复杂度O(nlogn))最长严格上升子序列 (时间复杂度O(n ^ 2))图片来源:@_snowstorm_二分优化后像贪心的思想。

2024-04-07 21:13:17 274

原创 搜索与图论——拓扑排序

有向无环图一定存在拓扑序列(有向无环图又被称为拓扑图),有向有环图一定不存在拓扑序列。无向图没有拓扑序列。拓扑序列:将一个图排成拓扑序后,所有的边都是从前指向后的。就是图的宽度优先遍历的一个应用。入度为0的点都可以排在最前边。入度:有多少条边指向自己。出度:有多少条边指向别人。

2024-04-04 01:51:43 347

原创 动态规划——计数类dp

例题:acwing900整数划分。

2024-04-02 16:47:51 192

原创 动态规划——区间dp

区间dp状态转移一般枚举套路。

2024-04-01 22:40:47 215

原创 搜索与图论——匈牙利算法求二分图的最大匹配

yxc讲的很生动hh,可以直接去看。

2024-03-31 00:37:53 79

原创 搜索与图论——染色法判定二分图

所以一个二分图一定可以成功被二染色,反之在二染色的过程中出现矛盾的图中一定有奇数环,也就一定不是二分图。由于图中没有奇数环,所以染色过程中一定没有矛盾。一个图是二分图当且仅当这个图中不含奇数环。

2024-03-30 22:25:13 327

原创 搜索与图论——Kruskal算法求最小生成树

kruskal算法相比prim算法思路简单,不用处理边界问题,不用堆优化,所以一般稀疏图都用Kruskal。判断a,b点是否连通以及将点假如集合中需要并查集的知识。每条边存结构体里,排序需要在结构体里重载小于号。Kruskal算法时间复杂度O(mlogm)

2024-03-30 18:01:32 674

原创 基础语法——重载小于号

其中,struct_name是你要重载小于号运算符的结构体或类类型的名称。在重载函数中,你可以根据自己的需要编写适当的比较逻辑,比较对象的某些成员变量或其他属性。重载小于号<运算符常用在结构体和类的对象之间的比较,

2024-03-30 16:43:37 177

原创 搜索与图论——Prim算法求最小生成树

生成树:每一次选中的t点,它和集合的距离对应的那条边,就是生成树的一条边。朴素版prim算法 时间复杂度O(n^2)算法流程和dijkstra算法非常相似。在最小生成树问题里,正边和负边都没问题。

2024-03-29 22:33:23 436

原创 搜索与图论——Floyd算法求最短路

floyd算法用来求多源汇最短路。用邻接矩阵来存所有的边。时间复杂度O(n^3)

2024-03-29 21:01:02 602

原创 搜索与图论——bellman—ford算法、spfa算法求最短路

spfa的核心优化思路是:拿我更新过的点来更新别人。一个点如果没有被更新过的话,拿它来更新别人一定是没有效果的,只有该点变小了,该点后面的点才会变小。spfa算法可以求出负环用的是抽屉原理,即把多于n+1个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。在一般情况下,spfa算法都优于bf算法,但遇到最短路的边数有限制的题时,只能用bf算法。spfa算法 时间复杂度一般O(m), 最坏O(nm)代码在spfa求最短路的模板上稍加改动即可。bf算法和dijkstra很像。spfa算法求最短路。

2024-03-29 12:39:17 444

原创 搜索与图论——Dijkstra算法求最短路

的最小距离:dist[j] = min(dist[j],dist[t] + g[t][j]);朴素版dijkstra时间复杂度为O(n^2),对于稠密图可以ac,但遇到稀疏图时会TLE。1、初始时,所有点都在圈内,所有点vis都=0,d[原点]=0,d[其他点]=+∞。m远小于n的平方为稀疏图,m接近n的平方为稠密图。1、初始化,{0,1}入队,d[1] = 0,d[其他点] = max。4、重复第2、3步操作,知道圈内为空。4、重复2、3步操作,直到队列为空。,把{d[j],j}压入队列。

2024-03-27 22:50:55 475 2

原创 基础语法——类、结构体、链表

类和结构体基本一样,唯一的不同就是:如果不声明是private或public,则类默认为private,结构体默认为public。

2024-03-24 00:32:23 99

原创 基础语法——字符串

可变长的字符序列,比字符数组更好用,需引入头文件#include需引用头文件#include字符串的初始化及读入输出。标准库类型string。字符串数组的常用操作。string库中函数。

2024-03-23 23:25:10 108

原创 动态规划——背包问题

此时我们选择逆序遍历max_value[j],因为j是逆序循环,max_value[j]会先于max_value[j - w[i]]更新,也就是说,用旧值max_value[j - w[i]] 去更新max_value[j],相当于上一行(上一个i)的max_value[j - w[i]] 去更新max_value[j],就不会出错。优化空间复杂度前模板 (时间复杂度O(nm),空间复杂度(nm))优化空间复杂度后模板(时间复杂度O(nm),空间复杂度O(m))多重背包问题的二进制优化。

2024-03-19 23:30:03 273

原创 基础语法——设置场宽

可使用库中的setw函数,cout

2024-03-10 23:27:31 393

原创 搜索与图论——BFS

实现的,用queue创建一个队列。宽搜的过程,通过队列来维护序列的状态空间,入队就排队等待,出队就扩展儿子们入队。宽搜的过程:从根开始,向下逐层扩展,逐层访问。宽搜适合于边权相同的最短路问题。广度优先搜索(BFS)宽搜的实现:宽搜是通过。

2024-03-10 22:22:06 428

原创 搜索与图论——DFS

因为栈满足先进后出的性质,所以当树的子树被全部搜完后才会回到该树。(后面的BFS使用队列实现的,因为队列满足先进先出的性质,适合于BFS的逐层遍历,这个在BFS文章中会提到。)DFS中递归调用的过程,系统自动通过栈去维护函数的。同理二叉树触碰点的时机分为:先、中、后。系统栈记录函数的返回地址,局部变量,参数传递等。深搜的过程:从根进入,向下走,走到底,向上走,即绕树兜圈,最后从根退出。深搜的计算:触碰节点的时机:1.入 2.下 3.回 4.离。多叉树的DFS简单模板。深搜的实现:深搜是通过。

2024-03-10 12:55:38 432

原创 数据结构——KMP

p[j + 1],让j回跳到能匹配的位置,如果找不到能匹配的位置,j就一直回跳到0。2.如果p[i] == p[j + 1],让j + 1,取模式串最长的相等前后缀可以保证不漏解,通过模式串前后缀的自我匹配的长度,计算next函数,给j指针打一张表,失配时就跳到next[i]的位置继续匹配。2.如果s[i] == p[j + 1],让j + 1。= p[j + 1],让j回跳到能匹配的位置,:i扫描主串,j扫描模式串,初始化 i= 1,j = 0。初始化:ne[1] = 0,i = 2,j = 0。

2024-03-07 19:28:48 387 1

原创 数据结构——哈希表

哈希表的作用:将一堆复杂庞大的数据映射到较小的内存空间中(一般是将1e9的数据映射到N = 1e5或1e6的数组里),手写哈希表一般支持插入、查找。处理冲突的方式:当h(11) = 3,h(21)= 3,即11与21都映射到3上时,就产生了冲突,此时可以在3上拉一条链(即单链表,h(3)为该链表的头节点head)同一条链上元素的插入方式与单链表的头插相同,把head改成h(k)即可。处理冲突的方法:h(k)= x时,看看k处有没有元素,如果没有就放到这里,如果有就看k+1的位置,以此类推往后遍历。

2024-03-07 14:42:47 394 1

原创 数据结构——单链表、双链表

【代码】数据结构——单链表、双链表。

2024-03-04 12:32:18 314 1

原创 数据结构——堆

堆主要支持这五个操作:1、插入一个数 2、求集合中的最小值(小根堆)最大值(大根堆)3、删除最小值 4、删除任意一个元素 5、修改任意一个元素。对父节点使用左右孩子编号法:第n个节点的左孩子是2n,右孩子是2n+1,父节点为n/2。堆可以使用stl库中的priority_queue来实现也可以手写。这五个操作全部可以用up和down函数来实现。完全二叉树(堆)可以用一维数组存储。大根堆:父节点大于子节点。小根堆:父节点小于子节点。

2024-02-26 20:42:39 356 1

原创 数据结构——单调队列

在指针i从左向右遍历的过程中,我们可以用一个队列来保存a数组所有下标(不包括i指向元素),越大的元素越靠近队头,越小的元素越靠近队尾。所以我们每次从队尾开始遍历,当队列不为空且队列元素大于a[i]时,tt --(弹出该元素),直到队头元素小于a[i]时,且把不属于窗口内的队头元素弹出(hh ++ ),输出队头元素,并将a[i]压入队尾。单调队列使用场景较少,一般只用在求滑动窗口与解决求一个数左(右)边第一个小(大)于他的元素(元素的下标)的问题上。使用单调队列优化时间复杂度可以达到O(n)。

2024-02-25 23:03:44 353

原创 数据结构——队列

【代码】数据结构——队列。

2024-02-25 16:15:52 312

原创 数据结构——单调栈

在指针i从左向右遍历的过程中,我们可以用一个栈来保存i左边的所有元素(不包括i指向元素),越大的元素越靠近栈顶,越小的元素越靠近栈底。所以我们每次从栈顶开始遍历,当栈不为空且栈顶元素大于a[i]时,tt --(弹出该元素),直到栈顶元素小于a[i]时,输出栈顶元素,并将a[i]压入栈顶。使用单调栈优化时间复杂度可以达到O(n)。由于每个元素一定会被压入栈且至多弹出一次,因此操作次数至多为2n,故时间复杂度为O(n)。单调栈通常被用来解决求一个数左(右)边第一个小(大)于他的元素(元素的下标)。

2024-02-24 23:45:05 309 1

原创 语法——字符串类型

使用char类型数组表示字符串时,可以使用指针比较来比较字符串的内容,但是需要注意,指针比较的是内存地址使用,所以使用“==”运算符比较时可以出现内容相同但输出结果为false的情况,因为他们的内存地址并不相同。string类型是c++标准库中提供的字符串类型,位于头文件中,提供了丰富的字符串操作函数。使用“==”运算符时,判断的是他们的内容。

2024-02-24 14:39:47 401 1

原创 数据结构——栈

【代码】数据结构——栈。

2024-02-20 14:50:18 299 1

原创 数据结构——Trie树

Trie树:高效存储和查找字符串集合的数据结构。

2024-02-17 23:42:16 359 1

原创 数据结构——并查集

【代码】数据结构——并查集。

2024-02-14 01:32:21 350 1

原创 基础算法——离散化

前缀和算法适合于数据范围大但数据量小的题目,把原数组的下标作为值映射到另一个数组中,这样数组不会越界。

2024-02-11 01:49:42 407 1

原创 基础语法——STL容器、常用库函数

deque(双端队列)是一个支持在两端高效插入和删除元素的线性空间,像是vector和queue的结合,与vector相比deque在头部增删元素只需O(1)的时间,与queue相比,deque可以像数组一样支持随机访问。头文件set主要包括set(有序集合)和multiset(有序多重集合)两个容器,即前者的元素不能重复,而后者可以包含若干个相等的元素。Vector是变长数组,支持随机访问,不支持在任意位置O(1)插入,为了保证效率,元素的增删一般应在末尾进行。set中的方法multiset都可以使用。

2024-02-10 20:06:42 331 1

原创 基础算法——二维差分

【代码】基础算法——二维差分。

2024-01-25 14:45:39 396 1

原创 基础算法——一维差分

前缀和中,输入原数组a[i] ,b[i] = b[i - 1] + a[i],求得b[i]为前缀和数组。在差分中,输入的原数组数组a[i]为b[i]的前缀和数组,我们要构造一个b数组,也就是“差分数组”,通过操作差分数组的某一项可以对前缀和数组的某一段进行整体操作。此外insert数组还完成了“差分数组”b[i]的初始化工作。下面通过insert函数对b进行操作,并构造前缀和数组b(本模板代码中对a、b数组两个数组没有时时联动关系,对某一数组操作以后需要通过手动操作同步)本文有任何问题欢迎大家指正!

2024-01-24 22:27:47 382 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除