自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c++中的欧拉筛

if (a == 1)//1既不是质数,也不是合数,所以不能从他开始a = 2;i<=b;i++)if (!vis[i])//vis为0, 说明这个数是质数//防止越界(背)//控制复杂度(背)return;

2024-05-28 22:05:27 235

原创 区间dp的模板

2.外循环遍历区间长度len,内循环遍历左起点l,右端点就是i+len-1,最内层遍历分界点k (l~r-1)f [ i ] [ j ] 表示在 i 到 j 这个区间里面,代表的某个属性。k一定要是从l开始遍历,直到r的前一个数。1.将数据读入完后,计算前缀和。,因为要保证k+1小于r,3.输出dp[1][n]

2024-04-15 19:58:13 277 1

原创 分组背包问题

【代码】分组背包问题。

2024-04-15 18:56:19 127 1

原创 多重背包问题

这里 c = s -(2^0 + 2^1 + 2^2 + ....... + 2^k) ,将每个物品可拆分的2的整数次方线性地存放在一个一维数组里面。思想:将三层嵌套优化成两层。对于每个物品 都可以用2的整数次方去家和,所以将最大数量拆分。然后,在用01背包问题即可,再单数组优化。

2024-04-15 18:29:10 130 1

原创 完全背包问题(朴素+优化)

朴素情况下我们需要循环0~k次,但是我们可以发现 f[ i , j ] = f [ i , j - v[i] ] + w[ i ]。与01背包问题唯一的区别是这里的物品可以无限次拿取,但不能超过背包总容量。所以会多一层循环列举同一件物品拿了多少次。因为 f [ i , j - v[i] ] 肯定是在 f[ i , j ] 前被更新,所以代码变成。这行代码本质上就是判断该物品到底要拿多少个,所以是在0~k个里面找出最大值。其核心也是判断要不要放入第i件物品。

2024-04-11 20:21:04 219

原创 01背包问题(朴素+优化)

max( f[j] , f[j - v[i]] )表示比较(把包空出v[i]的容积拿w[i])和(不拿w[i])哪个价格更高。f [i] [j] 表示的是一个最大值,在循环的时候会把所有情况的最大值都记录下来。后面两种情况都包含在 if (j > v[i]) 里。,v数组表示每个物品的体积,w数组表示每个物品的价格。f[i] 表示在背包容量是i的情况下能装的最大价值。n指的是物品的总数量,m是背包的总容量。

2024-04-11 19:20:02 260

原创 floyd求最短路

1.需要先将所有边初始化为无限大,用min解决重边问题。2.i=j的自环情况,边长设为0。

2024-04-07 18:10:01 127

原创 spfa求是否有负环

3创立一个cnt数组,用于存放从起始点到该点的路径通过了多少边,当cnt值大于n时,出现负环。2.不需要初始化dist,为0就行。因为负环只出现在w为负的情况,0会被负数更新。1.需要先将所有点都放入对列中,st数组初始化为true。

2024-04-01 19:24:18 166

原创 spfa求最短路

【代码】spfa求最短路(不存在负环)

2024-04-01 18:49:22 160

原创 Dijkstra求最短路(通过邻接表实现)

邻接表实现思路与邻接矩阵思路上一致,最小根队列可以的队头是所有元素中最小的,省去了用for循环判断最小dist的过程。而且,在使用确定的点更新链接的点时候,队列保存的点就是与该确定的点直接连接的点,所以也不需要for循环判断。而且队列是弹出的时候确定下该点是最小dist,这时候判断这个数是否已经弹出过,若不是就st=true。

2024-04-01 16:53:22 181

原创 Dijkstra求最短路(通过邻接矩阵实现)

其方式为:判断 (剩余每个点到原点的距离) 和 (本轮确定的点到原点的距离+确定的点到剩余每个点的距离)哪个更小,dist =min (0x3f , dist[t]+0x3f) = 0x3f。2.将dist初始化为无穷大,因为后面要取较小的dist。1.先将每a和b两点间距离设置为0x3f(无穷大),然后再读取每个g[a][b]的值。4.在确定了一个点后,可以用该点去更新剩下所有和他有链接的点的dist。5.当第n个点的dist还是0x3f的时候说明,他和其他点压根连不上。

2024-03-29 20:30:46 641 1

原创 基础并查集

【代码】基础并查集。

2024-03-28 20:38:03 161 1

原创 链式前向星

【代码】链式前向心。

2024-03-28 19:25:51 74 1

原创 c++中的单链表

【代码】c++中的单链表。

2024-03-28 15:47:49 443 1

原创 c++中的前缀和

【代码】c++中的前缀和。

2024-03-12 20:49:25 297 1

原创 c++中的dfs

【代码】c++中的dfs。

2024-03-07 20:21:02 170 1

原创 stl全排列

返回类型为true和false,存在下一个序列返回true,不存在返回false,(1)next_permutation:求下一个排列组合。(2)prev_permutation:求上一个排列组合。对于一个含有n个元素的数组全排列,一共有n!

2024-03-06 18:59:28 103 1

原创 c++中的归并排序

归并排序是分治算法的应用,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

2024-02-26 23:00:52 214

原创 c++中的快速排序

快速排序是一个基于分治的排序方法,是非常重要且应用比较广泛的一种高效率排序算法。

2024-02-26 22:04:26 311

原创 高精度加法运算

高精度加法主要用于c和c++中,在c和c++中位数特别大的数字不能直接相加,否则会计算出错,在这里需要通过高精度加法运算,其本质上是模拟两个数每个位数相加,逢十进一的计算方式,也就是小学的加法运算。例如,125+456,我们就需要先将5和6相加为11,再逢十进一,使答案的个位为1,然后再将十位上的2和5相加,再加上进位的1。这里我们想实现这样的模拟,需要将两个数先以数组的形式保存。

2024-02-26 18:10:16 124 1

原创 二分查找的使用方法

二分查找

2024-02-26 17:36:03 663 1

空空如也

空空如也

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

TA关注的人

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