自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 贪心(区间问题、Huffman树)

Huffman树:每次选中两个最小的数字相加为一个节点,再将数字入队比较。风险值中的最大值最小的是:w + s 从小到大排序。

2026-04-18 16:20:45 54

原创 数位DP、状压DP、树形DP、记忆化搜索

可以用 i - (1<<j)求出上一个点数的 状态,用if(i >> j & 1)判断这个状态是否包含该点。下次求某个被算过的位置的状态时,无需重新计算,直接返回。如果只是采用 dfs 暴搜的话,每次在一个位置搜索完之后,状态都不会被保留,下次 dfs 还是重新开始,就会有很多被算过的位置再重新计算。记忆化搜索就是 dfs + 记忆化数组f[i][j],在算某一个位置时把它的所有路径上 所有算过的位置状态保存在数组f[i][j]里。求某个节点的状态时需要先递归的求出每个子树的大小(树的重心)

2026-04-14 19:57:01 551

原创 二分法刷题

dp[i][j]将前 i 个数字,分成 j 段时,每段和的最大值的最小值。

2026-04-12 14:41:52 60

原创 线性DP、区间DP

将想要计算的点的状态分为两部分,从左上角、右上角两部分走过来。

2026-04-10 11:42:03 660

原创 动态规划DP刷题

即为所求,对 109+7 取模。

2026-04-08 11:38:53 218

原创 动态规划 (背包问题)

这里会对一个+ sw, 因为完全背包问题时, 是要把背包放满, k-1层时 j= j-v 会少放一个w, 所以所有的都加上一个 w 最大值就相等了.//f[j-v[i]] 这个刚好就是这一层i 中之前算的已经包含能存储 k个 w的 v的数, 现在算k+1。故 f[i][j]=max(f[i-1][j],f[i][j-v]+w),此时的状态转移方程就得到了简化。//之前01背包算的是上一层 i 中能包含 j = j-v[i] 的最大价值。我们发现可以使用下面的f[i][j-v]+w替换上面的后半部分式子。

2026-04-07 15:47:53 670

原创 数论(质数、约数、最大公约数、快速幂)

的公约数不断缩小数字,直到余数为 0,剩下的数就是最大的那个公约数。从2开始选质数, 并且把后面的2的倍数都打上标记。约数是N的所有质因子取(0~α1)的可能想乘。因式分解得到约数的质数因子向乘。里面出现的这些质数,全都是。

2026-04-01 20:01:34 447

原创 字符串刷题

KMP 最小循环节: ans=n-next[n], next数组中存储的是 第i 位字符串中最长相等的前后缀, i= n时存储的当前字符串中最长的相等的前后缀。剪掉上一次循环的开始。

2026-04-01 15:44:04 48

原创 最小生成树、二分图

遍历所有点找color为0 的点,然后dfs(j, 3-v)深搜找没有被染上相邻节点并染上不同的颜色。同一个颜色的在同一集合, 这个集合中的点不能有边相连。

2026-03-29 16:29:32 35

原创 搜索,递归(dfs、bfs)题

找一条配料重为n的路径, 一共十层每层三种可能。思路: 一共十种配料每种配料三种可能, 用。

2026-03-28 14:47:48 136

原创 图和图论(分层图最短路(免费 k 条边))

从最大的点开始向前走,用数组标记,能走到的点赋值起点的序号。因为x是最大的点所以标记的是最大的。已经标记上了不要再循环标记,会覆盖最大值。2、dijkstra算法可以直接入堆,因为是小根堆,只会先输出小的之后会被标记,无法再次遍历(标记选出来的最小的)3、bellman_ford不需要标记 ,因为是遍历所有结构体存储的边,只需要每次复制存储。4、spfa算法不能直接入队,要先判断标记 否则会重复遍历 (出入队都需要标记)1、朴素dijkstra算法的标记,是用来标记一开始选出来的。(标记选出来的最小的)

2026-03-27 15:33:56 285

原创 最短路问题(Dijkstra、Bellman_ford、Spfa、Floyd)

核心代码:d[ i ][ j ] =min(d[ i ][ j ], d[ i ][ k ]+d[ k ][ j ]);朴素Dijkstra: 给起点赋值, 循环n遍找出dist中最小且不在sta[N]中的, 再循环n个点更新dist数组。标记过,直接跳:if(sta[b]) continue;3. 更新必须用 backup [a]: dist[b] = min(dist[b], backup[a] + w);的最短路、循环k次,每次更新一条边,循环m条边(只更新dist数组不是正无穷的一条边)。

2026-03-25 18:23:02 942

原创 洛谷刷题(3.18)

【代码】洛谷刷题(3.18)

2026-03-24 10:28:13 141

原创 图论的DFS、BFS、拓扑排序

的一种特殊遍历方式,核心是「将图中所有节点排成一个线性序列,使得对于任意有向边。一个有向无环图一定至少存在一个点。DFS可以用来求节点的子树大小。

2026-03-21 16:25:14 149

原创 DFS、BFS

/循序无所谓但是(x,y)要对应。用vector<int> 进行深搜记录路径时记得恢复现场,数组不用是因为数字会被覆盖。解题思路:判断每一行可以放在哪个位置,用bool数组来记录列、对角线、反对角线。queue队列存数组是q.push({0, 0});// 遍历vector<int>,逐个输出元素。} //遍历vector<vector<int>>BFS类型的题目,先确定。应该存储什么,后确定存储。

2026-03-20 23:19:12 770

原创 字典树(trie)、并查集、堆、哈希表

哈希的过程字符不能映射为p进制的0,因为如果A是0,AA、AAA、的十进制都会变成0。求两个字符串之间是否先相等只需要求哈希值即可,区间求哈希值的公式是h[R]- h[L-1]*p^(R-L+1)。这题可以利用map映射的红黑数排出有序时间复杂度很低来做(暴力)也只是用来复习一下map数组,map数据用来将插入的数据排序cnt[x]++;解题思路:题中所给的所有数字都只被归为3类,只存在三种关系。可以将这些节点都放入一棵树中,用这些节点与根节点之间的距离%3来表示关系。开始异或,最高位为1时数是最大的。

2026-03-18 01:59:58 663

原创 map映射和哈希映射

实现,核心是「用哈希函数将键映射到存储位置」,从而实现平均 O (1) 的插入 / 查询 / 删除效率。所有可比较的类型(如 int/string)内部存储的每一个元素,本身就是一个。(一种自平衡的二叉搜索树)来组织这些。(而不是插入的 5→2→8 顺序)。中,每一个存入的元素(比如。自动排序(比如按数字从小到大)是 C++ STL 中的。内部都会被封装成一个。

2026-03-15 09:33:37 369

原创 结构体struct和类class

核心作用是将。

2026-03-13 13:44:36 294

原创 leetcode刷题(3.12)

从第 n-2 行走回第 0 行,一共被分为这两个阶段。也可以设置一个标记位来判断是哪个阶段,根据方向更新行列,向下:行+1,列不变,向上:行-1,列+1。因为无重复字符的最长子串是 "abc",所以其长度为 3。可以用一个数组作为标记数组,再使用双指针。如果标记数组中该标记第二次,用左指针一直回退删除标记次数。不能用双指针,双指针只能确定两个字符是否相同不能确定某个字符区间里面是否有重复的字符。,以从上往下、从左到右进行 Z 字形排列。,请你找出其中不含有重复字符的。:从第 0 行走到第 n-1 行,

2026-03-13 10:42:38 387

原创 单调栈、单调队列(滑动窗口)、KMP

其中1串为[ 1, next[ j ] ],3串为[ j - next[ j ] + 1 , j ]。的经典高效算法,核心是通过预处理模式串生成「部分匹配表(next 数组)」,避免匹配失败时主串指针回退,将时间复杂度从暴力匹配的 O(M∗N) 优化到 O(M+N)(M 是主串长度,N 是模式串长度)。:对next[ j ] ,是p[ 1, j ]串中前缀和后缀相同的最大长度(部分匹配值),即 p[ 1, next[ j ] ] = p[ j - next[ j ] + 1, j ]。

2026-03-10 15:31:40 388

原创 字符串复习(s.reverse()、s.find()、s.substr()、isdigit())

这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;先用指针找出符号下标再反向输出非0的 s[i] ,输出完前半部分后输出符号再将指针指向字符串末尾反向输出非0的s[i]只能用s.begin()、 s.end()来定位,不能直接传入s[i]

2026-02-12 20:57:49 155

原创 位运算、离散化

例题:假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。x (-10^9<=x<=10^9)为插入的坐标 如果要用数组当作一个数轴每次对数组这个数轴进行插数操作那么是不可能的,输入的数n、l、r 的最大范围为 1e5。计算输入的数二进制中1的个数:可以使用负数在计算机中是以补码的形式存在的,a的补码是a按位取反在加一得到的。

2026-02-10 23:04:26 172

原创 双指针算法

两个升序排序的有序数组 A 和 B,以及一个目标值 x。求出满足 A[i]+B[j]=x 的数对 (i,j)。升序的可以从两边向中间移动,从同一边开始移动,条件不匹配需要从头移动时间复杂度很高。

2026-02-08 16:08:07 40

原创 前缀和与差分

将序列中 [l,r] 之间的每个数加上 c:可以在第L个数加上C,这样在计算前缀和时后面的每个数都会加上C。在第R+1位置的数减去C,在计算前缀和时后面的每个数都会加上-C相抵消。会重复计算加法,运算量太大(可以先将数组中第i个位置前面的几个数相加存储在新定义的数组当中,想要计算中间段的数据和时用数组中的数相减即可。

2026-02-08 15:28:07 56

原创 高精度(加减乘除)

三、乘法(适用于被乘数较小)

2026-02-06 01:47:03 33

原创 二分(整数二分)

O (logn),远优于顺序查找的 O (n)。,核心思想是 「折半缩小查找范围」

2026-02-06 01:08:29 40

原创 排序(快排、归并)

它同样是基于「分治思想」的经典排序算法,和快速排序不同的是,它采用「先递归拆分、后有序合并」的思路,排序稳定性高,最坏时间复杂度也能保持。:把一个复杂的大数组排序问题,拆解成两个小规模的子数组排序问题,递归解决子问题,最终合并得到有序数组。的元素放到基准左边。基准值可以选数组最左边、最右边、中间。,它是算法中非常经典的排序算法,基于「分治思想」实现,效率很高(平均时间复杂度。倒数第二层为基准,最后一层为单个的数并且每个数都满足将。可以理解为将大的数组分为树状结构,的元素放到基准左边,将。

2026-02-06 00:31:26 95

原创 数据结构(栈、队列)

栈、队列

2026-02-05 16:36:53 59

原创 单链表、双链表

用数组表示时算法更快,每个节点存储两个值(数据域、指向下一个节点的指针)用两个数组e[N]、ne[N]表示,head为头指针,idx 存储当前用到哪个点 (链表是一个一个插入的,是选中空的内存空间标号,存储数据域的数组下标)。双链表是单链表的升级版,核心区别是每个节点不仅保存指向下一个节点的指针,还多了一个指向前一个节点的指针,这让它可以。,不像数组那样占用连续内存,节点可以分散存储,靠指针 / 引用维系前后关系。插入数据:只需要写在K点的右边插入一个数,想在左边插入:add(l[k], x)。

2026-02-03 21:29:08 45

空空如也

空空如也

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

TA关注的人

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