自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法学习,准备2022蓝桥杯(5.17计数类DP)

学习目标:No.11计数类DP学习内容:整数拆分问题:求将正整数n无序拆分成最大数为k的拆分数,要求所有的拆分方案不重复。例如,将n=5,k=5,对应的拆分方案有:(1) 5=5(2) 5=4+1(3) 5=3+2(4) 5=3+1+1(5) 5=2+2+1(6) 5=2+1+1+1(7) 5=1+1+1+1+1背包做法:把整数n看作容量为n 的背包,有n个物品,体积分别为1到n我们表示出状态计算:f[i][j] = f[i - 1][j] + f[i - 1][j

2021-05-17 14:47:28 261

原创 算法学习,准备2022蓝桥杯(5.11线性DP)

学习目标:No.10线性DP学习内容:最长公共子序列问题DP模板:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 1010;int n, m;char a[N], b[N];int f[N][N];int main(){ cin >> n >> m >>

2021-05-11 21:48:21 202

原创 算法学习,准备2022蓝桥杯(5.11线性DP)

学习目标:No.10线性DP + 贪心学习内容:最长上升子序列的二分做法依然是这一个数列3 1 2 1 8 5 6,如果这个序列的一个数能接到3的后面,那么它一定能接到1的后面,显然接在1的后面比接在3的后面更合适,这样存的预算值能够更大。到第i个数时,前面i - 1个最长上升子序列结尾的值存当前最小的那一个。如果把子序列最后一个值放在坐标系里,那么该序列是严格单调递增的。证明:假设第6个子序列的最小值比第五个还要小,因为子序列是递增的那么第六个结尾的上一个数一定会比第五个要小,那么第五个存

2021-05-11 21:08:15 229

原创 算法学习,准备2022蓝桥杯(5.10线性DP)

学习目标:No.10线性DP学习内容:最长上升子序列问题:输入7个数字 :3 1 2 1 8 5 6.则该序列的最长上升子序列为{1, 2,5,6}DP:其中,f[5]表示的意思是以5为下表的数作为结尾的上升子序列。第五个数是8,则子序列有8 18 28 18 128 38.我们把第i个数确定,以i - 1作为分类点。若a[i - 1] < a[i] 所以长度为f[i - 1] + 1.DP模板:#include <iostream>#include

2021-05-10 21:20:30 193

原创 算法学习,准备2022蓝桥杯(5.10线性DP)

学习目标:No.10 线性DP学习内容:最难最难的DP终于来了!希望这次能学懂十分之一,加油!题目大意是找到一条路,经过的数字之和最大。例如7 + 3 + 1 + 7 + 5 = 23.每个位置都有两种走法,一共有2^n - 1 种走法。如果用暴搜来做,时间复杂度就是2^n - 1DP:看看从上往下考虑方便还是从下往上考虑方便。从上往下:若遇到重复数字,例如图片中的4,需要特判从1往右下走来还是0往左下走来。处理边界问题比较麻烦从下往上:看看这个数是花丛那个地方上来的,无论哪个数,左

2021-05-10 15:49:18 146

原创 算法学习,准备2022蓝桥杯(5.6位运算)

学习目标:No.9位运算学习内容:位运算有两个基本的应用一个是求二进制数n中的第k位数字另一个是返回二进制数n的最后一位1n = 15 = (1111)2 k的下标:个位是第0位步骤:1:先把第k位移动到最后一位,用右移运算 n >> k2:看一下个位是几 x & 11, 2步合起来就是n >> k & 1lowbit操作:树状数组的基本操作。lowbit(x)代表返回x的最后一位1。例如想= 1010, lowbit(x) = 10x

2021-05-06 21:34:02 242

原创 算法学习,准备2022蓝桥杯(4.22双指针算法)

学习目标:No.8双指针算法学习内容:之前学习的归并排序,快速排序运用到过双指针算法写双指针算法时,先把暴力写法想出来,然后看一下有没有单调性,如果有的话,就可以利用单调性把我们的时间复杂度降低。举个例子:1 2 2 3 4 5找到其中最长的不重复子序列如果用朴素的暴力算法,我们需要i从1到n循环,j从1到n循环,然后判断i和j满足的条件,此时的算法时间复杂度是O(n^2)。现在我们用双指针算法,i和j最开始先指向第一个位置,i往后走,走到2,看一下i, j是否重复,不重复的话,j不

2021-04-22 22:11:31 201

原创 算法学习,准备2022蓝桥杯(4.22差分算法)

学习目标:No.7差分与差分矩阵学习内容:原数组有a1,a2, …, an构造新的数组b1, b2, …,bn使得ai = b1 + b2 + … + bi即b1= a1,b2 = a2 - a1, b3 = a3 - a2, …, bn = an - an-1a是b数组的前缀和,b是a数组的差分。相当于高数中积分和微分的关系假如我们想把a数组l到r区间内的所有数都加上C,只需要在b数组中,bl + C,此时al到an都会加上C,我们并不想让a数组的r到n区间也加上C,所以只需要br

2021-04-22 16:52:09 197

原创 算法学习,准备2022蓝桥杯(4.21前缀和算法)

学习目标:No.6前缀和算法学习内容:一般我们定义前缀和数组的下标是从1开始然后把下标为0的位置赋值为0;比如说当你要计算[1, 10],就是计算S[10] - S[0],当我们把S[0]定义为0时,就等于计算S[10]了。1.如何求S,前S个数的和就等于前S- 1个数的和加上第S个数的和。2.作用:快速求出原数组中任意一段的和。前缀和模板:#include <iostream>#include <cstring>#include <algorithm

2021-04-21 20:05:41 137

原创 算法学习,准备2022蓝桥杯(4.21高精度除法)

学习目标:No.5高精度算法之高精度除法学习内容:高精度除法模板:#include <iostream>#include <vector>#include <algorithm>using namespace std;//A / b, 商是C,余数是rvector<int> div(vector<int> &A, int b, int &r){ vector<int> C;

2021-04-21 10:34:47 144

原创 算法学习,准备2022蓝桥杯(4.21高精度乘法)

学习目标:No.5高精度算法之高精度乘法学习内容:高精度乘法模板:#include <iostream>#include <vector>using namespace std;vector<int> mul(vector<int> &A, int b) // C = A * b, A >= 0, b >= 0{ vector<int> C; int t = 0;

2021-04-21 10:12:04 162

原创 算法学习,准备2022蓝桥杯(4.21高精度减法)

学习目标:No.5高精度算法之高精度减法学习内容:高精度减法的存大整数和加法一样算减法时,每次计算A - B - t,t是借位,有借位t = 1,没有借位t = 0。当A - B - t ≥ 0时,算A - B - t,当A - B - t < 0时,算A - B + 10 - t。算A - B时分两步,当A ≥ B时,直接算A - B,当A < B时,算-(B - A)。这样可以保证每次都是较大的数减去较小的数,不会出现负数情况,最高位无需再借位,省去了很多边界情况高精度减法模板:

2021-04-21 09:36:21 169

原创 算法学习,准备2022蓝桥杯(4.20高精度加法)

学习目标:No.5高精度算法之高精度加法学习内容:高精度加法:第一步:存大整数,把整数的每一位放到数组里去整数位数:1 2 3 4 5 6 7 8 9数组下标:0 1 2 3 4 5 6 7 8存放位置:9 8 7 6 5 4 3 2 1因为在做运算的时候可能会有进位,需要在高位上补一个数,对应的要在数组上补一个数。此时,倒着存位数的时候,只需要在数组末尾补上一个数即可,如果不这么存,要在数组开头补一个数,非常麻烦。所以数组存放整数位数的时候从高位开始存。用t表示上一位的进位,a+b

2021-04-20 23:00:48 158

原创 算法学习,准备2022蓝桥杯(4.20整数二分算法)

学习目标:No.4整数二分学习内容:整数二分步骤:取区间l到r找到一个性质,把区间一分为二,一半满足,一半不满足取mid,检查一下mid是否满足其中一半,若满足左半边,那么所求位置一定在mid到r,更新左端点,l = mid。若不满足左半边,那么所求位置一定在l到mid - 1,更新右端点,r = mid - 1。在检查mid是否满足右半边,若满足右半边,则所求位置一定在l到mid,更新右端点,r = mid。若不满足右半边,所有位置一定在mid + 1到r,更新右端点,l = mid

2021-04-20 19:06:25 152

原创 算法学习,准备2022蓝桥杯(4.19归并排序算法)

学习目标:No.3归并排序学习内容:归并排序也是一种分治思想。和快速排序不同的是,快速排序可以以任意一点作为分界点,把数组分为左右两部分,再对左右两部分分别递归排序。而归并排序是用数组下标在中点的那个位置, 把数组一分为二,先进行递归排序,再把排序好的两部分合成一部分。合成的时候用到双指针算法我们用两个指针分别指向两个有序数组的第一个位置。因为数组已经排好序了,所以指针指到的一定是数组当中最小的。比较两个指针的大小,小的那一个放到新的数组当中去,直到指针走到最后一个位置。归并模板:#in

2021-04-19 19:18:24 214

原创 算法学习,准备2022蓝桥杯(4.19快速选择算法)

学习目标:No.2快速选择算法学习内容:快速选择算法的前两步和快速排序一样走完前两步之后,统计一下x左边的数的个数和x右边数的个数。如果k比左边数的个数小,那么k一定在x 的左边,所以我们只需要递归排序左边的数即可。如果k比左边的数大,那么k一定在x的右边,所以我们只需要递归排序右边的数即可。快排模板:#include <iostream>#include <cstring>#include <cstdio>#include <algori

2021-04-19 16:33:36 158

原创 算法学习,准备2022蓝桥杯

学习目标:No.1快速排序学习内容:快速排序步骤:1.确定分界点,可以是左端点,右端点,或者任意一点。2.调整区间,使得所有≤x的在左半边,≥x的在右半边。3.递归处理左右两段:用两个指针i,j。i从左边走,j从右边走。当i走到比x大的数停下,j开始走。j遇到比x小的数停下,交换i,j。直到i,j相遇。快排模板#include <iostream>#include <cstdio>#include <cstring>#include <a

2021-04-19 15:57:33 596

原创 位运算

文章目录一、位运算是什么?二、例题1.a^b2.64位数乘运算3.最短Hamiton路径一、位运算是什么?位运算有以下几种分类:与 x&y或 x|y非 !x异或 x^yint 是32位机器数1:0000000…012:0000000…103:0000000…11补码:类似于补数,例如4的补数是6,23的补数是77.两个相加得到一个整数。1+x=000000x=000000-11+1111…1111=000000…000所以计算机里面用1111…1111表示-1x..

2021-01-17 22:56:38 554

原创 冒泡排序

冒泡排序代码如下(示例):/排序算法二:冒泡排序//1.和插入排序一样,先分成已排序和未排序两部分//2.从数组末尾开始依次比较相邻元素,如果大小关系相反就交换//3.重复上述步骤,如果全部按顺序排完后,跳出步骤#include<iostream>using namespace std;//用flag标记第几个元素前的已经排好序了int bubbleSort(int A[], int N){ int sw = 0;//sw标记交换的次数 bool flag = 1; f

2020-11-19 18:07:16 111

原创 排序算法

插入排序代码如下(示例)://排序算法一:插入排序//要点:1.将开头元素视为已经排好顺序//2.取出没有排好序的第一个元素记为A[i]//3.在已经排序的地方,把所有大于A[i]的元素都往后挪一个//4.把取出的这个元素A[i]放到空出来的地方#include<stdio.h>void showinsert(int A[], int N){ int i; for (i = 0; i < N; i++) { if (i > 0) printf(" "

2020-11-19 17:34:56 104

原创 广度优先(BFS)

文章目录层层递进——广度优先搜索完整代码总结层层递进——广度优先搜索接上文的迷宫问题,仍然用二维数组存储这个迷宫。小哼在迷宫入口(1,1)处,那么他下一步应该往右边或者下边走。如果用DFS的方式,先让他往一边走,一直走到走不下去为止,然后再尝试另外一种路线。那么,BFS的方法就是一层一层扩展,来找到小哈的位置。具体如下:最开始小哼在(1,1)处,那么他往下走的可能是(2,1)或(1,2)。这两个点没有找到小哈,只能继续往下走,假如走到(1,2),那么从(1,2)开始,能够走到的点是(3,1)或者(2

2020-11-04 21:36:47 826

原创 迷宫问题(解救小哈)

文章目录解救小哈完整代码读入数据输出数据总结解救小哈 迷宫由n行m列的单元格组成(n和m都<=50),每个单元格要么是空地要么是障碍物。小哼要以最快的速度解救小哈,帮助小哼找到一条从迷宫起点通往小哈所在位置的最短路径。注:障碍物不能走,也不能走到迷宫之外。首先我们可以用一个二维数组来储存这个迷宫,刚开始的时候,小哼处于迷宫的入口处(1,1),小哈在(p,q)。就是找从(1,1)到(p,q)的最短路径。小哼一开始在(1,1)他只能往右或者往下走。先让小哼往右边走,直到走不通了再回到这里,然后再.

2020-11-03 22:54:26 1430 2

原创 DFS深搜

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言深度优先搜索完整代码总结前言忘带课本了,记一下课本上的内容,不然等还书就忘记了。深度优先搜索输入一个数你,输出1~n的全排列。转换成模型就是编号1,2,3的扑克牌放到1,2,3的盒子中去,每个盒子只放一张牌,一共有多少种不同的放法。我们先走到1号盒子前面,规定从1号扑克牌依次放入,所以把1号扑克牌放进1号盒子,然后走到2号盒子前面。按照规定的顺序,2号扑克牌放在2号盒子,3放3号盒子。此时生成了一种排列就是“1,2,

2020-11-02 20:20:51 321

空空如也

空空如也

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

TA关注的人

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