
算法学习经验
文章平均质量分 57
一只小白的算法学习之路
Avalon Demerzel
ICPC区域赛银牌+退役ACMer
展开
-
【动态规划】ST算法解决区间最值询问问题(RMQ问题)
一、前言RMQ问题、即区间最值问题,在遇到这类题目的时候,我们可以用暴力枚举两重for循环的方式来解决,但是这样的话会在时间上超时。如果想要不超时的话,我们也可以用线段树来解决该问题。但是我们在日常的训练中意识到:线段树的代码比较多并且比较复杂,稍有不慎的话就有可能出错。因此,在这里作者简单介绍一种写起来比较简单的算法-----ST算法。例题引入:Acwing 天才的记忆从前有个人名叫 WNB,他有着天才般的记忆力,他珍藏了许多许多的宝藏。在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果原创 2022-02-21 20:22:21 · 450 阅读 · 0 评论 -
【数论】四则运算的取模处理
一、前言在日常的算法题学习中,我们有时会遇到一些题目中所需要处理的数据比较大。由于计算机的特点,我们直接处理这些大数据是会出问题的,为了避免出现这样的问题,题目中往往需要对计算中的数据或者结果取模处理,但是我们往往不能等到所有的计算结束后再取模处理,因为这样数据往往已经超出规定的范围了。因此,我们在进行运算的时候就要同时进行取模处理,在本篇博客中,会简单介绍一下四则运算的取模处理,但是限制与篇幅问题,本博客只会直接介绍处理方法,对于原理则不做证明。二、加法运算取模加法取模的处理是比较简单的。(A +原创 2022-01-28 09:52:37 · 4645 阅读 · 1 评论 -
【排序】动画演示10大排序算法
传载自优快云博客:你必须知道的十大经典排序算法汇总0.排序算法种类和时间复杂度比较、时间复杂度指的就是一个算法执行所耗费的时间空间复杂度定义为该算法所耗费的存储空间1.冒泡排序(Bubble Sort)1.比较相邻的元素如果第一个比第二个大,就交换它们两个。2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;3.针对所有的元素重复以上的步骤,除了最后一个;4.重复步骤1〜3,直到排序完成。点击查看演示动图function bubbleS转载 2021-09-30 14:14:45 · 200 阅读 · 0 评论 -
【紫书第十章】数论与概率入门
数论与概率入门一、数论初步1.欧几里得算法(辗转相除法)2.素数筛-埃氏筛3.素数筛-欧拉筛4.扩展欧几里得算法5.快速幂二、概率基础1.容斥原理2.杨辉三角和二项式定理3.离散概率基础三、其它数学专题1.汉诺塔2.斐波拉契数列一、数论初步1.欧几里得算法(辗转相除法)在求两个数的最大公因数时,我们通常使用欧几里得算法来求解。int gcd(int a,int b){ if(b==0)return a; else return gcd(b,a%b);}最小公倍数:(a*b)/最大公约数原创 2021-08-11 19:01:01 · 478 阅读 · 0 评论 -
【紫书第九章】动态规划(DP)常见模型汇总与DP问题分析方法
看完了紫书第九章还是有一点迷茫,dp果然是一个比较抽象和困难的知识点,这里结合学长(优快云账号:蹲坑玩手机)上课的课件和看完紫书后自己的一些思考来记录一下dp学习的心得。一、基础dp1.性质:拥有子问题,子问题最优解(即拥有最优子结构),对于一个原问题解最优,其子问题必定也是最优,同时原问题的最优解依赖于其子问题的最优解子问题重复性,一个子问题可能会影响多个不同的下一阶段的原问题无后效性,即此时的之前状态无法直接影响未来的决策,换句话说就是之前的每个状态如何得来并不影响未来对此时(当前)状态的原创 2021-08-10 17:26:34 · 1801 阅读 · 1 评论 -
【动态规划】数位DP入门题:不要62
题目链接:LibreOJ 不要62解题思路:数位dp入门题目,数位dp是存在有模板的,可以通过一道题来领悟数位dp的思路。详细分析将放在代码中解释。//#pragma GCC optimize(2)#include<iostream>#include<iomanip>#include<cstdio>#include<string>#include<algorithm>#include<cmath>#include<原创 2021-07-23 11:24:38 · 256 阅读 · 0 评论 -
【动态规划】LIS最长上升子序列和LCS最长公共子序列
前言—子序列定义在学习LIS和LCS之前,我们需要了解子序列的定义:假设我们定义一个长度为n的数组a[n],那么我们从数组中拿出m(不大于n)个元素,按照这些元素在原数组中排列的顺序排列成一个新的数组,我们可以说这个新的数组为原数组的子序列数组。例如:a[5]={1,2,3,4,5},那么b[2]={1,3,5},c[3]={2,4,5}…都是a的子序列数组。在这里要强调,子序列数组中元素在原数组中不一定要求是连续的。例如不一定只有b[3]={1,2,3}或者c[3]={3,4,5}才是a的子序列数组,原创 2021-07-16 11:45:38 · 133 阅读 · 0 评论 -
【差分算法入门】例题讲解(代码逐句分析)
首先在介绍差分算法之前,读者需要了解什么是前缀和算法。前缀和算法是一种比较简单好用的算法,不过在这里就不详细讲解了。如果是对于前缀和算法还不了解的同学建议在学习完前缀和算法后再来学习差分算法。首先我们要知道,对于一个原数组a[n],我们可以构造出一个前缀和数组b[n]用来求解数组a的区间总和。而差分数组则是构造一个数组c[n],使得原数组a变成了数组c的前缀和数组。这个操作有一点像在高数中对于一个原函数,前缀和是原函数的倒数,而差分则类比于对原函数求微分。那么,我们求出差分数组c又有什么用呢?情景引入原创 2021-05-16 17:09:45 · 1008 阅读 · 0 评论 -
【排列组合】只上代码不解释
排列组合的定义由于在高中时期就已经做过详细的学习,因此笔者在此就只放出我常使用的函数代码,适合救急。#include<iostream>#define ll long longusing namespace std;ll C(ll m, ll n)//m个里选出n个{ if (m == 0||n==0||n>=m) return 1; if (n == 1) return m; else { return C(m - 1, n - 1) * n / m;原创 2021-04-14 14:39:47 · 158 阅读 · 0 评论 -
【快速乘与快速幂例题讲解】相乘取余爆long long?试试快速乘吧!
就在昨天,笔者正在愉快的刷着牛客的比赛,然后,我遇到了这样一题学长的白日梦20级的学弟学妹们来了,实验室里可怜弱小又无助的wzc学弟终于变成了学长,可以压迫下一级了(?)。但是wzc学长苦于自己的实力进步太慢,很担心自己在学弟学妹们面前丢人,所以天天熬夜在实验室里训练。某一天wzc学长训练得实在太累了,居然在大白天做起了梦。在梦里面,wzc学长在第一天有一个初始的码力值x,第二天的时候码力值变为了x2,第三天的时候码力值变为了x3......第i天的时候码力值变为了xi。现在wzc学长想知道第i原创 2021-04-12 19:47:43 · 464 阅读 · 1 评论 -
【数论】素数 埃氏筛法c++代码分析(逐句分析)
在有一些题目中,我们需要用到素数。而我们判断素数最简单的方法就是用这个数依次试着从2到他本身减一暴力取余,如果没有有一个数取余后得0则代表这个数是素数。代码如下bool pri(int n){ for(int i=2;i<n;i++) { if(n%i==0) return 0; } return 1;}当题目简单的时候,我们当然可以用这种方法来判断素数。但显然,在某些充满了出题人恶意的题目中,这种暴力搜索是会超时的,并且我们发现如果我们需要在题目中重复用到素数,这种暴力原创 2021-03-27 16:22:52 · 2220 阅读 · 4 评论 -
【DFS】n皇后问题(代码逐句分析)
在dfs问题中,最经典的问题莫过于8皇后问题(是吗? ),对于何为8皇后问题,在这里就不做赘述(你就是懒 )。在本篇博客中,我们将就8皇后问题的变种问题n皇后问题进行分析。首先上题目 题目链接Acwing 棋盘问题给定一个 N×N 的棋盘,请你在上面放置 N 个棋子,要求满足:每行每列都恰好有一个棋子每条对角线上都最多只能有一个棋子 1 2 3 4 5 6 -------------------------1 | | O | | | | |原创 2021-03-25 20:53:26 · 426 阅读 · 0 评论 -
【快速幂】a^b%p问题
我们在通常处理a^b问题中,一般来说第一时间想到的就是通过循环来暴力解决,但是这样的话时间复杂度就是o(n)。c++代码一秒的算力大概是1e7–1e8之间,倘若数据较大,题目就会超时导致TLE。因此,我们在这里介绍一下快速幂的算法。题目引入AcWing a^b求 a 的 b 次方对 p 取模的值。输入格式三个整数 a,b,p ,在同一行用空格隔开。输出格式输出一个整数,表示a^b mod p的值。数据范围0≤a,b≤1e91≤p≤1e9在这里,显然用暴力100%会导致超时,因此我原创 2021-03-22 17:39:15 · 946 阅读 · 2 评论 -
【BFS】迷宫问题c++代码详解(逐句分析)
迷宫问题是一个经典的bfs问题,bfs相比于dfs,代码的实现上较为复杂,因此迷宫问题对于初学者而言是有一定难度的。而在这里,笔者将对迷宫问题做出比较详细的解释。由于本篇博客侧重于对迷宫问题的讲解,所以对于一些其它概念将做一些省略,在看本篇博客前你需要掌握:1、BFS的基本概念与思路2、数据类型queue的概念与使用方法3、pair的使用方法4、memset函数的使用方法如果对上面4点知识点还有不了解的地方,可以先点个收藏,然后在了解相关知识点后再来看本篇博客。(要回来哦)上题目!!!!(附原创 2021-03-20 14:07:24 · 5502 阅读 · 9 评论 -
【动态规划】01背包问题(c++代码逐句分析)
01背包问题是一个经典的动态规划问题,不过并不适合作为动态规划的入门训练,适合作为一个动态规划的进阶训练题。如果你在此前从未接触过动态规划,那么建议先点个收藏,在学习了动态规划的相关知识点并且做了一些简单练习后再回过头来看这篇博客学习01背包问题。(要回来看哦!)当了解了基础知识后回过头来看01背包问题,我们会发现问题中最难理解的就是状态转移方程的逻辑(亲身经历,说多了都是泪 ),所以笔者会在下文详细解释。好了,废话不多说了,先上题!!!**01背包问题**有 N 件物品和一个容量是 M 的背包。每原创 2021-03-16 22:29:40 · 4045 阅读 · 2 评论