
算法
文章平均质量分 84
介绍常用算法即经典例题
Zsprinkle
这个作者很懒,什么都没留下…
展开
-
合肥盛荣与海南昌仕乒乓球俱乐部学习感悟
乒乓球技术原创 2022-10-04 22:04:29 · 1583 阅读 · 1 评论 -
图论前置知识 —— 关于图的一些入门概念【搭配详细图解】
顶点集与边集图常用一个二元组G = <V,E>来表示,V表示顶点集,E表示边集。|V|表示顶点集中元素的个数,即图的顶点数,也称为图G的阶。N阶图表示图G中有N个顶点。|E|表示边集中元素的个数,即图G的边数。需要注意的是:顶点集V和边集E均为有限集合,其中E可以为空集,V不可以为空集。也就是说一个图至少有一个顶点。线性表和树可以为空表或者空树,但是图不可以为空图。无向图如果图G中的每条边都是没有方向的,则称其为无向图。其每条边都是两个顶点组成的无序对。例如顶点V1和顶点V3之间的边,记原创 2022-03-12 21:44:50 · 5762 阅读 · 1 评论 -
算法基础14 —— 图论入门之Bellman-Ford算法(Acwing 853 有边数限制的最短路)
回顾迪杰斯特拉算法不能处理负的边权Dijkstra 例2Bellman-FordBellman-Ford算法可以解决负权边。举例理解:假设边给出的顺序是:2 3 21 2 -31 5 54 5 23 4 3设dis[v]为s到v的最短距离,则初始时dis数组如下图所示:第一次松弛:当加入2->3这条边时,dis[2] + 2 = ∞ + 2仍然为∞,故不更新dis数组当加入1->2这条边时,dis[1] + (-3) = 0 + (-3) = -3 &l原创 2022-02-23 18:25:33 · 426 阅读 · 0 评论 -
算法基础16 —— 递推(铺骨牌问题 + 信奥一本通 1313 位数问题 + NOIP 2002 过河卒)
基本概念所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果。初始条件如何得到呢?其实,初始条件要么是问题本身已经给定,要么是通过对问题的分析与化简后确定的递推的方式顺推逆推递推的特点可用递推算法求解的题目一般有以下两个特点:问题可以划分成多个状态;除初始状态外,其它各个状态都可以用固定的递推关系式来表示。递推入门 — Fibonacci数列1、1、2、3、5、8、13… …递归写法:#include <iostream>原创 2022-02-13 22:43:55 · 1261 阅读 · 0 评论 -
算法基础15 —— 分治算法(归并排序 + 快速排序)
分治法的基本概念、思想分治法是一种很重要的算法。字面解释,分治分治,分而治之。就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。不难发现,分治法的思想与递归极其类似。实际上,分治与递归确实是密不可分。分治法的策略将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破。分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模1较小)则直接解决,否则将其分解为k个规模较小原创 2022-02-12 22:14:49 · 15205 阅读 · 0 评论 -
算法基础14 —— 图论入门之迪杰斯特拉算法(Dijkstra)
回顾Floyed算法可以求任意两点之间的最短路径,但是Dijkstra算法只能求一个结点到另一个结点的最短路径,它是一个单源的最短路径算法Floyed算法的时间复杂度为O(n^3),故一般情况下数据范围要求在100以内Dijkstra算法描述设起点为s,dis[v]表示从s到v的最短路径长度, 如dis[3] = 6表示从起点到3号结点的最短路径为6pre[v]为v的前驱节点,用来输出路径初始化:dis[v] = ∞(v ≠ s);//初始时路径为无穷 dis[s] = 0;//s原创 2022-02-11 01:51:46 · 1659 阅读 · 0 评论 -
算法基础17 —— 单调栈(Acwing 830 单调栈)
单调栈的分类单调递增栈:栈中的元素从栈底到栈顶是单调递增的。不难发现,单调递增栈的出栈序列递减单调递减栈:栈中的元素从栈底到栈顶是单调递减的。不难发现,单调递减栈的出栈序列递增单调栈的应用求数列中每个元素X的右边第一个大于元素X的新元素Y求数列中每个元素X的左边第一个小于元素X的新元素Y给一个数组,返回一个大小相同的数组,返回的数组的第i个位置的值是对于原数组中的第i个元素,至少往右走多少步,才能遇到一个比自己大的元素给一个数组,返回一个大小相同的数组,返回的数组的第i个位置的值是对于原原创 2022-02-10 13:19:23 · 993 阅读 · 0 评论 -
算法基础14 —— 图论入门之弗洛伊德算法(Floyed + Dijkstra + Bellman-Ford + SPFA)
入门概念带权图:如下图所示,我们把边带有权值的图称为带权图可以将边的权值理解为两点之间的距离一张图中任意两点间会有不同的路径相连最短路径:最短路径就是指连接两点的这些路径中最短的一条Floyed、Dijkstra、Bellman-Ford、SPFA可以有效地解决最短路径问题。需要注意的是:边的权值可以为负。当出现负边权时,有些算法不适用最短路径问题是图论中典型的问题,多数模型可以归结为一下三种管道铺设线路安装地图规划问题引入国庆期间,7535寝室计划去旅行。在出发前,寝室长原创 2022-02-10 02:12:52 · 3893 阅读 · 0 评论 -
算法基础13 —— 树进阶(优先队列的应用—合并果子 + 哈夫曼树)
堆的应用虽然可以把堆画成二叉树的形式,但是其本质依然是一维数组拓展:树状数组也可以画成树的形式,它与堆一样,本质依然是一个一维数组堆的例题:NOIP 2004 合并果子非常妙的一道例题,即是堆,也是贪心分析:假设目前有四堆果子分别是2、3、5、6。合并果子方案一:如果先将2与3合并,会耗费体力值5;再将5与6合并,会耗费体力值11;最后将5与11合并,会耗费体力值16;采取以上合并方案,一共需要耗费体力5 + 11 + 16 = 32合并果子方案二:先将耗费体力最小的2与3合并,会原创 2022-02-09 21:28:27 · 1475 阅读 · 0 评论 -
算法基础12 —— 树进阶(二叉搜索树 + 堆—优先队列)
二叉搜索树定义:二叉搜索树,又叫二叉排序树、二叉查找树(Binary Search Tree)它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树性质:二叉搜索树的中序遍历结果为一个无重复数据的升序序列判断方法:将待判断的二叉树采用中序遍历,结果保存在vector中,然后遍历vector,判断是否满足是升序并且无重复数据,不满足则不是二叉搜原创 2022-02-08 17:53:28 · 1557 阅读 · 0 评论 -
算法基础11 —— 树入门(二叉树的遍历以及构造 + 普通树转换成二叉树 + 例题 + 二叉树的一些操作)
字符二叉树的遍历对于以上二叉树先序遍历为(根左右) : ABCDEFG中序遍历为(左根右) : CBEDAFG后序遍历为(左右根) : CEDBGFA层序遍历:(从左往右、从上往下) ABFCDGE以先序次序输入以上二叉树:ABC##DE###F#G##代码实现遍历操作:#include <iostream>#include <queue>using namespace std;typedef struct node{ char data;原创 2022-02-07 18:36:31 · 3010 阅读 · 0 评论 -
算法基础11 —— 树进阶(树状数组与线段树入门)
前置知识前缀和与差分那么,前缀和的主要用途又是什么呢?【答案】区间求和树状数组与线段树的整体关系线段树更为的宏观(可以理解为线段树的作用效果包含树状数组)树状数组的代码较短树状数组的作用以O(logn)的时间复杂度给某个位置上的数加上一个数(单点修改)以O(logn)的时间复杂度求前缀和(区间查询)树状数组可以快速、动态地求前缀和。例如,有一个数组将数组下标为4的位置加1,使其变为同时,前四个数字的前缀和也由10变成了11时间复杂度分析对于一个长度为N的数组,如果修改原创 2022-01-26 16:06:59 · 534 阅读 · 0 评论 -
算法基础11 —— 树入门(树的相关术语 + 二叉树的性质 + 顺序及链式存储 + 二叉树的遍历)
树?盆栽?下图是一棵典型的树数据结构中的树长这样:(不像树?倒过来看看?)树的相关术语一棵树是由n(n>0)个元素组成的有限集合,其中:结点:每个元素称为结点(node)根:每棵树有一个特定的结点,称为根结点(root),如上图的结点 ①子树:除根结点外,其余结点能分成多个互不相交的有限集合,其中每个子集又都是一棵树,这些集合称为这棵树的子树。性质一:一棵树中的任意两个结点有且仅有唯一的一条路径连通。性质二:一棵树如果有n个结点,那么它一定恰好有n-1条边原创 2022-01-25 22:06:17 · 651 阅读 · 0 评论 -
算法基础10 —— BFS (迷宫问题 + 一维坐标的移动 + 炸弹人 + 蒜头君回家)
前置知识 - 队列什么是队?STL —— queue特点:先进先出(First In First Out)方法:push(x):将x入队pop():队首元素出队front( ):获取队首元素back( ):获取队尾元素empty( ):判断queue是否为空size( ):队列长度#include<queue>#include<iostream>using namespace std;int main(){ queue<int&原创 2022-01-22 16:15:41 · 728 阅读 · 0 评论 -
算法基础1 —— 时间空间复杂度 + 进制转化
算法是解决问题的方法与步骤。原创 2022-01-16 14:03:22 · 2436 阅读 · 0 评论 -
算法基础9 —— 数论 (倍数 + 约数 + 素数(埃氏筛法) + 欧几里得与拓展欧几里得算法 + 快速幂)
数论 - 倍数定义: 对于自然数a和b,如果存在自然数k,使得k * a = b,那么称b是a的倍数性质:一个数有无穷多个倍数所有数都是其自身和1的倍数(任意一个整数x,一定有 1 * x = x)[1,n]范围内的x的倍数一共有n/x(向下取整)个举例说明第三条性质:例1: 取n = 12,x = 2,设在区间[1,12]内2的倍数最多有k个,则2 * k <= 12,即k <= 6。[1,12]内2的倍数一共有6个,分别为2( 1 * 2 ),4( 2 * 2 ),6(原创 2021-08-09 00:56:58 · 1569 阅读 · 0 评论 -
算法基础8 —— 详解贪心算法(部分背包问题 + 区间调度问题)
引言贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案。——《算法导论》原创 2021-07-26 00:49:34 · 8307 阅读 · 0 评论 -
算法基础7 —— 二分算法 (二分模板 + 洛谷-A-B数对 + 蓝桥杯-分巧克力) + 浮点二分(求一个数的三次方根 + 剪绳子)
二分查找原创 2021-07-11 00:03:11 · 1021 阅读 · 1 评论 -
算法基础6 —— DFS(全排列 + 数独游戏 + 子集 + 马走日 + N皇后 + 迷宫)
DFS的算法 —— 不撞南墙不回头,不到黄河心不死例1 全排列问题例2 子集例3 数独例4 马走日例5 N皇后例6 迷宫例7 染色DFS总结与模板原创 2021-06-26 17:31:59 · 816 阅读 · 1 评论 -
算法基础5 —— 线性表(链表的建立、输出、查找、插入、删除等操作)
线性表定义:线性表是最基本的一种数据结构,是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表中除了首元素和尾元素之外,每一个元素都有唯一的前驱和唯一的后续线性表包括顺序表和链表,其中,可以将顺序表理解为数组链表:链表由各结点组成,每个结点至少包括数据域和指针域。在上图中的链表里,head 为头结点(一般不存放数据),5所在结点为尾结点且其指针域为NULL物理与逻辑物理上连续指的是数据元素在计算机内存中的地址是连续的逻辑上连续指的是人们想象中的元素相邻链表原创 2021-06-22 00:34:30 · 5171 阅读 · 0 评论 -
基础算法4 —— 结构体(成绩统计) + 栈(模拟进制转换 + 优秀的拆分) + 指针
结构体结构体的实际应用场景:在实际问题中,一组数据往往具有不同的数据类型。比如,某次期末考试中要记录一个学生的考试信息,除了有姓名(char)外,还有班级(int)、性别(char)、语文、数学、英语的分数(int)等信息,这些信息中,类型不一样。那么,该如何存储呢?为了解决这类问题,引出了一种构造数据类型 —— 结构体类型。定义结构体的方法:struct 结构体类型名{ ... ... };例如:struct student{ int num;//学号 char name原创 2021-06-11 11:51:37 · 1091 阅读 · 0 评论 -
算法基础3 —— 递归(下) 杨辉三角 + 欧几里得算法 + 汉诺塔 + 递归与数组
例1 递归求解杨辉三角(如果想打印出杨辉三角,可以开一个二维数组,将每行每列的数值存入数组之中。本题使用递归求杨辉三角中的数值,可以不开数组,但是同样需要利用二位数组的思想来解题。)求解第一步:先将上图的杨辉三角向左旋转,并建立坐标,如下图所示:设delta(x,y)表示二维数组中第x行第y列所对应的值。由上图不难发现当x == y的时候,delta(x,y) = 1; 即delta(0,0) = delta(1,1) = delta(2,2) = delta(3,3) = delta(4,4原创 2021-06-06 18:19:22 · 1176 阅读 · 0 评论 -
算法基础3 —— 递归(上)
递归递归是算法竞赛中的难点。传说人可以理解迭代,但是神才能理解递归。(不要试图"理解"递归,有很大风险把自己绕进去)To Iterate is Human, to Recurse, Divine. —L. Peter Deutsch定义直接或间接地出现对自身的调用。本质递归 = 递进 + 回归(递进与回归缺一不可)如何理解递进与回归?你的面前有一扇门(一号门),打开这扇门,看到屋里面还有一扇门(二号门)。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门(三号门),你继续原创 2021-06-06 10:17:46 · 909 阅读 · 0 评论 -
算法基础2 —— OJ入门以及暴力枚举
暴力法原创 2021-06-05 23:48:45 · 1078 阅读 · 1 评论 -
应该是最全的计算机专业考研复试经验
考研初试、复试经验原创 2021-04-03 09:36:01 · 18670 阅读 · 9 评论 -
C++中STL知识总结1.0
无聊闲谈考研调剂真是一件痛苦的事情,耽搁了这么多天才发现自己好久没写博客了。今天写一篇,主要涉及C++中STL的使用。在此之前,我哥(有阿里和腾讯工作经验)跟我聊了很多,说如果我以后打算从事计算机行业,一定要入职大厂,否则以后在大城市还是比较难混的,具体原因就不细说,但是要有这个目标,就算未能如愿,也会极大的提高自身能力。然后在这总结一下入职大厂的条件:高质量的竞赛经历(acm / ccpc)并获奖高质量的实习经历(如阿里实习)985本科或者211和极个别双非毕业的硕士上面的极个别双非代指杭电原创 2021-03-26 22:52:42 · 499 阅读 · 0 评论 -
Heavy Transportation(并查集 + 图论 + prim/Kruskal + 最小生成树-代码RE待修改)
原题链接DescriptionBackground:Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business.But he needs a clever man who tells him whether there really is a way from the place his customer has build his giant steel crane t原创 2021-03-03 00:10:39 · 146 阅读 · 2 评论 -
还是畅通工程(并查集 + 图论 + prim/Kruskal(详细) + 最小生成树 + 最短路)
原题链接Problem Description某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见原创 2021-03-01 23:24:10 · 1008 阅读 · 2 评论 -
营救(并查集 + 图论 + prim/Kruskal + 最小生成树)
原题链接题目背景“咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动得热泪盈眶,开起了门……题目描述妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了t区,而自己在 s区。该市有 m条大道连接 n个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从 s至 t的路线,使得经过道路的拥挤度最大值最小。输入格式第一行有四个用空格隔开的 n原创 2021-03-01 21:05:42 · 242 阅读 · 4 评论 -
动态规划(NOIP2000 提高组 方格取数)
原题链接题目描述设有N×N 的方格图(N ≤ 9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0。如下图所示(见样例):某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从 A点到 B点共走两次,试找出 2条这样的路径,使得取得的数之和为最大。输入格式输入的第一行为一个整数 N(表示N × N 的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单原创 2021-02-24 17:24:21 · 543 阅读 · 3 评论 -
动态规划4(NOIP2008 普及组 传球游戏)
原题链接题目描述上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目。聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球方法被视作不同的方法,当且仅当这两原创 2021-02-24 10:46:43 · 327 阅读 · 0 评论 -
动态规划3(NOIP 2002 普及组 过河卒)
原题链接题目描述棋盘上 A点有一个过河卒,需要走到目标 B点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,A点(0, 0)、B点(n, m),同样马的位置坐标是需要给出的。现在要求你计算出卒从 A点能够到达 B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。输入格式一行四个正整数,分别表示 B点坐标和马的坐标。输出格式一个整数,表示所有的路径条数。原创 2021-02-23 22:43:26 · 700 阅读 · 0 评论 -
动态规划2(数塔问题)
数塔问题是动态规划的经典问题,下面以洛谷的一个例题来分析数塔问题以及动态规划:原题链接题目描述观察下面的数字金字塔。写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。在上面的样例中,从7→3→8→7→5 的路径最大输入格式第一个行一个正整数 rr ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。输出格式单独的一行,包含那个可能得到的最大的和。样例输入573 88 1 02 7 4 44 5原创 2021-02-23 17:45:55 · 12646 阅读 · 2 评论 -
括号匹配问题
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:1. 左括号必须用相同类型的右括号闭合。2. 左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。输入样例:()[]()[]{}(]([)]输出样例:truetruetruefalsetruefalse思路:接收字符串然后对其进行遍历①如果遇到左括号,则左括号入栈②如果遇到右括号,则与栈顶元素进行匹配若匹配成功则栈顶元素出栈若匹配失败则返回原创 2021-01-26 23:17:41 · 764 阅读 · 0 评论 -
BFS(宽搜算法)入门
BFS算法经常需要用到队列辅助,如二叉树的层次遍历下面简单回顾一下队列的使用:#include <queue>#include <cstdio>#include <iostream>using namespace std;int main(){ queue<int> q; q.push(1); q.push(3); q.push(5); q.pop(); int a = q.front原创 2021-02-06 00:16:37 · 2184 阅读 · 0 评论 -
矩阵快速幂求Fibonacci数列
我们用二维数组来存储矩阵,设两个矩阵 int A[m][n],int B[n][p],再建立一个答案矩阵 int C[m][p]。可通过如下代码实现两个矩阵的乘法运算for(int i = 0;i < m;i++) for (int k = 0;k < n;k++) for (int j = 0;j < p;j++) C[i][j] += A[i][k] * B[k][j];A[m][n] * B[n][p] = C[m][p]我原创 2021-02-04 00:56:58 · 2677 阅读 · 1 评论 -
快速幂 & 大数取模及例题(极其详细)
首先,以杭电OJ的一道题引入话题人见人爱A ^ B接着,先给出取模的几个重要结论:(a * b) % p = (a % p * b) % p(a + b) % p = (a % p + b) % p(a + b) % p = (a % p + b % p) % p(a - b)% p = (a % p - b % p) % p(a * b)% p = (a % p * b % p) % p对于最后一条性质,即多个因子连续的乘积取模的结果等于每个因子取模后的乘积再取模的结果上题的要求也简原创 2021-02-02 13:44:15 · 10370 阅读 · 5 评论 -
欧拉函数
首先介绍一下互质整数的概念:公约数只有1的两个整数,叫做互质整数如:7,11,13是整数互质。欧拉函数数论中,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目(因此φ(1)=1)。φ(8)=4,因为1,3,5,7均和8互质。对于一个质数,如11,在其之前的数都与其互质,故 φ(11) = 11 - 1 = 10...原创 2021-01-31 22:11:03 · 128 阅读 · 0 评论 -
完全背包
Dynamic Programming之完全背包01背包与完全背包的比较:在0/1背包问题中,第 i 件物品只可以放0个或者1个,即选择或者不选。而在完全背包问题中,第 i 件物品可以放入0,1,2…个。即每件物品可以放入无限多次。与0/1背包相同的是,最大价值是物品数量 i 与背包容量 j 的函数。最终的最大价值就是物品数量 i 从0增长到n,背包容量 j 从0增长到m时的 f [ n ] [ m ] 函数值。f[ i ][ j ]表示前 i 件物品放入容量为 j 的背包的最大价值。①若当前物品的原创 2021-01-22 22:57:10 · 93 阅读 · 0 评论 -
尺取算法
尺取法尺取法可以用来优化for循环,降低程序的时间复杂度。例题:第一行是一个整数n,表示数组元素的个数。第二行有n个空格分隔的整数。第三行有一个整数sum。输出一个整数,表示有多少对元素之和等于sum。输入格式:61 3 5 7 9 3110输出:2尺取的思想:对于一个递增的序列,定义两个指针i,j遍历数组选取两数求和,i从左往右遍历,j从右往左遍历,会出现三种情况。sum以10为例① a[ i ] + a[ j ] == sum此时直接记录下此情况,然后执行i++和j- -操作来寻原创 2021-01-16 16:10:36 · 1430 阅读 · 3 评论