自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 树型背包传统写法

树形DP。这是个什么东西?为什么叫这个名字?跟其他DP有什么区别?相信很多初学者在刚刚接触一种新思想的时候都会有这种问题。没错,树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上。既然说了这是一种思想,那么单讲的话,也讲不出什么东西来。所以我们结合具体题目进行讲解,希望大家可以在题目中领悟这种思想。提到树形DP入门题,很多人都会提到这道题,的确,这道题堪称树形DP的典范,但是我个人认为,这道题的处理方式不够普遍,这道题的处理方式相比之下更加普遍。下面我们就将结合这道题进行讲解。

2025-12-20 11:18:43 322

原创 dfn序优化树上背包

把树用 DFS 编号压成一条序列,用“跳过整棵子树”来保证结构合法,再在序列上做类似 01 背包的 DP。

2025-12-17 23:17:30 742

原创 c++快速建堆(内含比较器讲解)

先说大根堆// 默认大根堆等价于priority_queue<int, vector<int>, less<int>> pq;// 显式大根堆小根堆常用堆函数push(x)—— 插入元素,—— 删除堆顶,—— 取堆顶元素(大根堆最大 / 小根堆最小),—— 是否为空size()—— 元素数量下面说说less和greater比较器这两个是,你会在sortset/map等地方经常看到。

2025-09-10 22:58:12 360

原创 c++最长上升子序列长度

/bs函数:用来搜索endss数组中比arr[i]小(不能相等)的第一个元素下标(从右往左算的话)//bs就是要找6的下标(大小最接近 arr[i]且比 arr[i] 小)int len=0;//len为end数组的实际大小,也是答案所在。//dp[i]:以位置i为结尾的最长递增子序列的长度。//end[i]:长度为i+1子序列的最小结尾。//方法2:时间复杂度O(N*log N)//方法1:(时间复杂度 O(N^2))//举个例子:现在arr[i]==7。//下标 0 1 2 len。

2025-08-18 20:48:49 589

原创 c++实现小根堆优化dijkstra算法(单源到各点的最短距离),并且用链式前向星建图

/n为给你的边的数量,m为点的数量,start为源点。//小根堆实现,其中每个元素包含两个值,第一个是点,第二个是该点到源点的距离。//head[ ] 头边号。// 修改比较器的比较方式,用来实现小根堆,比较的是该点到源点的距离。//weight[ ] 权值。// 0 1 2 3 边号。//net[ ]下一条边号。// 0 1 2 3 边号。//to[ ] 去往的点。// 0 1 2 边号。// 正确初始化weight数组。

2025-07-31 16:18:24 458

原创 嵌套递归问题(以表达式求值为例)

string str;//准备两个栈//两个顶指针int cur=0;int ans=0;//入栈操作i++){if(cur!=0){where=i+1;break;cur=0;cnt2--;cnt2--;}else{i=where-1;}else if(!if(cur){cnt1--;cnt2--;cnt1--;cnt2--;}else{cur=0;//清算过程i<cnt2;i++){}else{

2025-07-22 18:04:50 381

原创 静态数组实现前缀树

int cnt=1;i<maxn;i++){p[i]=0;e[i]=0;j<26;j++){int cur=1;p[cur]++;i++){p[cur]++;e[cur]++;int cur=1;i++){int cur=1;i++){int cur=1;i++){return;e[cur]--;i<=cnt;i++){p[i]=0;e[i]=0;j<26;j++){cnt=1;init();

2025-07-08 20:57:52 291

原创 大根堆加小根堆查找中位数o(N)时间复杂度

/ i是大根堆大小,j是小根堆大小。

2025-06-30 21:58:09 287

原创 归并排序建议写法

int i=l;j<=r;j++){int n;cin>>n;i<=n;i++){i<=n;i++){return 0;

2025-06-30 11:47:00 159

原创 堆排序code

/从顶到底建堆排序。//从底到顶建堆排序。

2025-06-08 09:55:18 474

原创 线性dp练习

尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成。尼克的一个工作日为 n 分钟,从第 1 分钟开始到第 n 分钟结束。当尼克到达单位后他就开始干活,公司一共有 k 个任务需要完成。如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成。

2025-05-24 15:03:44 352

原创 写起来比较复杂的深搜题目

年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置。那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。编写程序,通过使用一张小镇的地图帮助警察局找到那辆车。程序必须能表示出该车最终所有可能的位置。小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。. 表示小镇上那块地方是可以行车的,而符号 X 表示此处不能行车。拉尔夫所开小车的初始位置用字符的 * 表示,且汽车能从初始位置通过。

2025-05-23 16:36:41 877

原创 二分答案练习

对于给定的一个长度为 N 的正整数数列 A1∼N​,现要将其分成 M(M≤N)段,并要求每段连续,且每段和的最大值最小。关于最大值最小:例如一数列 4 2 4 5 1 要分成 3 段。将其如下分段:第一段和为 6,第 2 段和为 9,第 3 段和为 1,和最大值为 9。将其如下分段:第一段和为 4,第 2 段和为 6,第 3 段和为 6,和最大值为 6。并且无论如何分段,最大值不会小于 6。所以可以得到要将数列 4 2 4 5 1 要分成 3 段,每段和的最大值最小为 6。

2025-05-23 15:30:36 460

原创 深搜题(如何找到进入下一层深搜的条件)

如今许多普通百姓家有了私家车,一些人喜爱自己驾车从一个城市到另一个城市旅游。自己驾车旅游时总会碰到加油和吃饭的问题,在出发之前,驾车人总要想方设法得到从一个城市到另一个城市路线上的加油站的列表,列表中包括了所有加油站的位置及其每升的油价(如 3.25 元/L)。现在要你帮忙做的就是编写一个程序,计算出驾车从一个城市到另一个城市的旅游在加油和吃饭方面最少的费用。

2025-05-22 19:50:54 684

原创 最小生成树练习题

又到了一年一度的明明生日了,明明想要买 B 样东西,巧的是,这 B 样东西价格都是 A 元。但是,商店老板说最近有促销活动,也就是:如果你买了第 I 样东西,再买第 J 样,那么就可以只花 KI,J​ 元,更巧的是,KI,J​ 竟然等于 KJ,I​。现在明明想知道,他最少要花多少钱。

2025-05-19 21:37:46 916

原创 导弹拦截(排序)

经过 11 年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为 0 时,则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。而当天的使用代价,就是所有系统工作半径的平方和。某天,雷达捕捉到敌国的导弹来袭。由于该系统尚处于试验阶段,所以只有两套系统投入工作。如果现在的要求是拦截所有的导弹,请计算这一天的最小使用代价。

2025-05-18 12:02:39 785

原创 素数筛(欧拉筛算法)

if(i%prime[j]==0)//i是前面某个素数的倍数时,也需要退出,能大大提升时间效率。j++)//进行倍增,用i去乘以i之前(包括i)的素数。//将倍增结果进行标记。if(i*prime[j]>n)//倍增结果超出范围,退出。if(vis[i]==0)//i是素数,则存起来。

2025-05-17 15:29:38 359

原创 线性dp练习(碱基配对)

定义状态是 dp 最重要的步骤之一,状态定义得不好后面全都无法进行。像这种线性动态规划,定义经常是“fi​ 表示前 i 个满足要求时的答案”。因为这道题有两个串,很容易想到状态的定义是“fi,j​ 表示 a 串的前 i 个碱基和 b 串的前 j 个碱基的相似度”。

2025-05-17 15:29:01 878

原创 bfs搜索加标记连通区域id实现时间优化(空间换时间)

有一个仅由数字 0 与 1 组成的 n×n 格迷宫。若你位于一格 0 上,那么你可以移动到相邻 4 格中的某一格 1 上,同样若你位于一格 1 上,那么你可以移动到相邻 4 格中的某一格 0 上。你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

2025-05-15 17:28:38 959

原创 最大子段和(就是之前总结线性dp思想)

给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。

2025-05-14 16:14:50 442

原创 dp练习(含多重背包转01背包)

/a数组存放的是每种砝码的数量,w数组是每种砝码的重量,f[i]表示 “重量 i 成立”i++)//一遍扫,统计成立的重量。//那么这个重量加上这个未使用的砝码的总重量也成立。设有 1g、2g、3g、5g、10g、20g 的砝码各若干枚(其总重 ≤1000),可以表示成多少种重量?if (f[k])//若此重量成立。sum+=c[i];

2025-05-14 15:36:53 899

原创 Kruskal 算法实现最小生成树完整代码,包含各边权值,以及边和顶点信息

uf.find(edge.v)) { // 不形成环。cout << "总权值: " << totalWeight << endl;cout << "输入每条边 (u v weight):" << endl;

2025-05-13 21:22:46 1799

原创 拓扑排序(找入度为零)+dp

小明要去一个国家旅游。这个国家有 N 个城市,编号为 1 至 N,并且有 M 条道路连接着,小明准备从其中一个城市出发,并只往东走到城市 i 停止。所以他就需要选择最先到达的城市,并制定一条路线以城市 i 为终点,使得线路上除了第一个城市,每个城市都在路线前一个城市东面,并且满足这个前提下还希望游览的城市尽量多。现在,你只知道每一条道路所连接的两个城市的相对位置关系,但并不知道所有城市具体的位置。现在对于所有的 i,都需要你为小明制定一条路线,并求出以城市 i 为终点最多能够游览多少个城市。

2025-05-13 20:23:24 663

原创 二维差分(主要看原数组与差分数组的关系)

/ 累加差分数组,得到最终结果。

2025-05-13 17:50:55 261

原创 Floyd实现多源最短路径(涉及松弛操作)

+i){ //生成有向图关系,maxium为不连接。void show(int start, int end){ //显示路径,单源,多源直接for循环调用这个函数。//生成有向图关系矩阵。//生成有向图关系矩阵。++j){ //终点。++i){ //起点。++k){ //中间点更新。

2025-05-11 15:50:19 462

原创 求单源最短路径(迪杰斯特拉(Dijkstra))

/各编号到源点距离。//邻接矩阵创建一个图。

2025-05-10 11:58:40 445

原创 Kruskal求最小生成树(要求路径压缩)

该代码解决的问题是:给定一个无向图,求其最小生成树(即连接所有顶点的边权值和最小的树),并输出最小生成树中。:并查集(Disjoint Set Union, DSU)的父节点数组,用于判断两个顶点是否属于同一集合。// 如果两个顶点已经在同一集合,跳过(避免成环):初始化并查集,每个顶点的父节点初始化为自己(即每个顶点自成一个集合)。:在查找过程中,直接将路径上的所有节点指向根节点,加快后续查询速度。如果两个顶点已经在同一集合,说明选择这条边会形成环,跳过。的根节点(代表元),并进行路径压缩优化。

2025-05-09 20:52:05 581

原创 记忆化搜索

第 2 天:吃 6 个橘子,剩余橘子数 9 - 2*(9/3) = 9 - 6 = 3。第 2 天:吃 2 个橘子,剩余橘子数 3 - 2*(3/3) = 3 - 2 = 1。(3 可以被 3 整除)第 1 天:吃 3 个橘子,剩余橘子数 6 - 6/2 = 6 - 3 = 3。第 3 天:吃 2 个橘子,剩余橘子数 3 - 2*(3/3) = 3 - 2 = 1。如果剩余橘子数 n 能被 3 整除,那么你可以吃掉 2*(n/3) 个橘子。第 3 天:吃掉剩余 1 个橘子,剩余橘子数 1 - 1 = 0。

2025-05-09 15:32:14 443

原创 图的着色问题(一道不错的dfs题)

给定无向连通图 G 和 m 种不同的颜色。用这些颜色为图 G 的各顶点着色,每个顶点着一种颜色。如果有一种着色法使 G 中每条边的 2 个顶点着不同颜色,则称这个图是 m 可着色的。图的 m 着色问题是对于给定图 G 和 m 种颜色,找出所有不同的着色法。

2025-05-06 17:56:53 301

原创 普通消元求解线性基并求解最大异或和

/ 输出最大异或和。// 将每个数插入线性基。// 向线性基中插入一个数。// 获取最大异或和。

2025-05-05 12:11:32 297

原创 唯一分解定理代码实现

10 素因子分解分数 300全屏浏览切换布局作者 何钦铭单位 浙江大学给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p1​k1​⋅p2​k2​⋯pm​km​。

2025-04-29 13:06:24 852

原创 基于c++的LCA倍增法实现

原理就不写了,自己找b站视频学习// 最大节点数// 最大对数深度// 树的邻接表表示// 每个节点的深度// parent[i][j]表示节点i的2^j级祖先// DFS预处理每个节点的深度和父节点信息// 直接父节点i < MAXLOG;// 初始化,从根节点开始预处理// 根节点的父节点设为-1// 查询u和v的LCA// 确保u是较深的节点。

2025-04-27 22:06:07 1000

原创 关于动态规划的思考[特殊字符]

从第一层走到最底下的第二层,找权值和最大的是不是简单了,这样我们便能确定第一层for循环该怎么写,倒序从n-1层,一直便历到第一层,那每一个i又该如何处理?我们要知道,我们在处理i时,意味着i-1以前的信息我们全知道了,也就是如果要处理从i层到n层,那么底下面的层我们全都已经处理好了,那能否利用这个条件来推导出递推公式呢?一定要记住,动态规划的核心步骤永远是先把问题规模缩小看能否处理,然后看看能否在逐步扩大规模的过程中利用之前已经处理好的信息来写出递推公式,最后问题规模一直到题目所需,答案也就递推了出来。

2025-04-26 13:33:52 188

原创 差分优化效率

语文考试结束了,成绩还是一如既往地有问题。

2025-04-25 14:56:04 429

原创 反素数c++

反素数具有以下性质:它是范围内因数个数最多的数如果有多个数具有相同的最大因数个数,则选择其中最小的一个反素数的质因数分解中,质数是从小到大排列的,且指数是单调不增的。

2025-04-22 20:42:05 714

原创 (数论)Lucas定理

Lucas定理内容:对于素数p,有。

2025-04-22 17:41:40 223

原创 二维前缀和核心学习

作为在虚拟世界里统帅千军万马的领袖,小 Z 认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小 Z 来说是非常重要的。首都被认为是一个占地 C×C 的正方形。小 Z 希望你寻找到一个合适的位置,使得首都所占领的位置的土地价值和最高。

2025-04-20 16:00:28 642

原创 多重背包转01背包优化

服务器好好玩。

2025-04-17 15:45:06 816

原创 对输入的精细处理

王老师正在教简单算术运算。细心的王老师收集了 i 道学生经常做错的口算题,并且想整理编写成一份练习。编排这些题目是一件繁琐的事情,为此他想用计算机程序来提高工作效率。王老师希望尽量减少输入的工作量,比如 5+8 的算式最好只要输入 5 和 8,输出的结果要尽量详细以方便后期排版的使用,比如对于上述输入进行处理后输出 5+8=13 以及该算式的总长度 6。王老师把这个光荣的任务交给你,请你帮他编程实现以上功能。

2025-04-17 10:37:10 501

原创 dfs?行不通啊

L 国即将与 I 国发动战争!!

2025-04-14 20:33:37 373

空空如也

空空如也

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

TA关注的人

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