随笔分类 -  算法基础

摘要:###这里即将要介绍的是算法提高课中最长上升子序列的一些模型和题解### ###题目一:怪盗基德的滑翔翼 ### 1017. 怪盗基德的滑翔翼 - AcWing题库 题面介绍:就是有N幢高度已知的楼,从任意一个楼开始,允许向右向左任一方向向下滑翔,求能滑到的最多的楼房数。 分析:其实就是求问这个长度 阅读全文

posted @ 2022-05-08 22:00 ZheyuHarry 阅读(29) 评论(0) 推荐(0) 编辑

摘要:状态压缩DP,是今天所要讲到的内容。 其实状态压缩这个概念我们并不陌生,我们之前在做八数码问题的时候就是把那张图给压缩成了一串数字来表示,这里其实也是利用到了状态压缩,让图的内容可以很简单的用数来表示。 例题:291. 蒙德里安的梦想 - AcWing题库 题解:我们来分析一下这道题该怎么做,以及我 阅读全文

posted @ 2022-04-27 20:56 ZheyuHarry 阅读(40) 评论(0) 推荐(0) 编辑

摘要:我们知道,动态规划用来解决一类最优化问题,通过将原问题分解成若干的子问题,并综合子问题的最优解从而得到原问题的最优解,线性DP就是这么一种现行的分析DP的思路。 我们这里来介绍几种常见的模型以及例题: 1.数字三角形模型 例题:898. 数字三角形 - AcWing题库 状态表示: f[i]j[j] 阅读全文

posted @ 2022-04-25 23:45 ZheyuHarry 阅读(137) 评论(0) 推荐(0) 编辑

摘要:我们知道,背包问题是一种非常经典的动态规划问题,本文总结了几种类型的背包问题并进行了分析: 根据百度百科,我们可以看到背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总 阅读全文

posted @ 2022-04-23 15:58 ZheyuHarry 阅读(240) 评论(1) 推荐(0) 编辑

摘要:求一个数的最大公约数最常用的方法就是辗转相除法,也就是说gcd(a,b) == gcd(b,a%b); 为什么说这样是可以的呢,我们首先证明一下if(a%d == 0 && b%d == 0) then (k1*a+k2*b)%d == 0; 我们接下来继续说明一下原式为什么可行: 假设a>b,a 阅读全文

posted @ 2022-04-06 20:16 ZheyuHarry 阅读(398) 评论(0) 推荐(0) 编辑

摘要:让我们先来看到欧拉函数的定义: 我们相当于已经知道了公式只需要按照公式进行质因式分解即可,直接来看代码吧: #include<bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; while(n -- ){ int a; c 阅读全文

posted @ 2022-04-06 20:10 ZheyuHarry 阅读(66) 评论(0) 推荐(0) 编辑

摘要:这一部分我们将会讲到数论中的快速幂问题,是用于快速求解a^k%p 的此类问题的; 1<=a,k,p <= 1^9; 解题思路: 我们假设a^k的因式分解可以分解为x1,x2,x3....,xk,ans = (x1%p)(x2%p)....(xk%p); 因为我们如果按照朴素做法肯定要一步步求出a^k 阅读全文

posted @ 2022-04-06 19:55 ZheyuHarry 阅读(31) 评论(0) 推荐(0) 编辑

摘要:先前我们已经介绍过了怎么判断质数和约数,现在我们对于约数的个数和约数之和也要进行求解,而求解的方法就是根据算术基本定理来的! 先介绍一下什么是算术基本定理: 算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1^a1*P2^a2*P3^a3. 阅读全文

posted @ 2022-04-04 18:01 ZheyuHarry 阅读(174) 评论(0) 推荐(0) 编辑

摘要:约数和质数是我们在认识数学问题中经常遇到的两个概念,所以如何判断他们肯定也是我们需要去考虑! 首先我们看一些判断质数: 因为我们可以知道质数的概念指的是这个数只能被1和自身整除,所以我们枚举从2~sqrt(x)的范围内的数,是因为如果不是质数的话是一一对应的,如果在2~sqrt(x)这个范围内被整除 阅读全文

posted @ 2022-04-04 17:46 ZheyuHarry 阅读(90) 评论(0) 推荐(0) 编辑

摘要:我们如何计算从1~n一共有多少个质数呢,我们就要考虑一种筛法,用已知的数把确定的那些不会是质数的数全部筛掉! 我们先介绍第一种一般筛法: void get_primes2(){ for(int i=2;i<=n;i++){ if(!st[i]) primes[cnt++]=i;//把素数存起来 fo 阅读全文

posted @ 2022-04-03 16:14 ZheyuHarry 阅读(169) 评论(0) 推荐(0) 编辑

摘要:这就是NTR算法 ?? 渣男渣女算法 ?? 接下来要介绍的NTR算法,啊呸,不对不对,匈牙利算法,是一种确定二分图的最大匹配数量的一种非常高效的算法; 我们先介绍一下二分图的匹配以及最大匹配: 二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于 阅读全文

posted @ 2022-03-27 11:54 ZheyuHarry 阅读(87) 评论(0) 推荐(1) 编辑

摘要:接下来的内容,是关于基础图论的最后一节:二分图的相关问题; 我们先简单介绍一下二分图,二分图不一定是一个连通块,可能是多个连通块组成,然后我们把所有的点分别划分为两个部分,一个在左边的点集中,另一个在右边的点集中,所有的边只存在于两个点集之间,而在点集内部是不会存在连边的,这样的图我们就叫作二分图; 阅读全文

posted @ 2022-03-27 11:35 ZheyuHarry 阅读(170) 评论(0) 推荐(1) 编辑

摘要:就如前面对Dijkstra算法进行堆优化一般,我们在这里也要对前面的Prim算法进行优化,啊,不对,彻底换个新思路; 既然我们本身是要求最小生成树对吧,所以我们肯定要让边权越小越好,那么如果我把边权按照从小到大进行排序,然后遍历,如果说这条边的两个点的根节点已经相同,也就是在同一个集合中了,那么就不 阅读全文

posted @ 2022-03-26 17:10 ZheyuHarry 阅读(33) 评论(0) 推荐(1) 编辑

摘要:首先在介绍这个算法之前我们要之明确一下什么是最小生成树的概念: 由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图G 的最小生成树。 换言之,我们不能生成环且要让边权值和最小! 这里先介绍一个Prim算法: Pri 阅读全文

posted @ 2022-03-26 16:56 ZheyuHarry 阅读(79) 评论(0) 推荐(1) 编辑

摘要:接下来是图论问题求解最短路问题的最后一个,求解多元汇最短路问题 我们之前一般都是问1-n的最短路径,这里我们要能随便去问i到j的最短路径: 这里介绍一下Floyd算法:我们只有一个d[maxn][maxn]数组直接存储从i到j的最短路径,我们先看代码: #include<bits/stdc++.h> 阅读全文

posted @ 2022-03-21 20:47 ZheyuHarry 阅读(119) 评论(0) 推荐(1) 编辑

摘要:在Bellman-Ford算法之后,我们总算迎来了spfa算法,其实就如同堆优化Dijkstra算法之于朴素版Dijkstra算法,spfa算法仅仅是对Bellman-Ford算法的一种优化,但是在形式上,它看起来特别像堆优化Dijkstra算法罢了! Bellman—Ford算法会遍历所有边并进行 阅读全文

posted @ 2022-03-21 17:49 ZheyuHarry 阅读(272) 评论(0) 推荐(1) 编辑

摘要:这个算法也是紧承我们之前讲过的关于图论的内容,我们在前面分析图的时候说过了对于不同的图论问题,我们会有不同的求解方法,那么这里我们讲到Bellman-Ford算法是用于解决有边数限制的求解最短路问题。 我们先介绍一下我们之前讲过的Dijkstra算法为什么在这里失灵了,因为我们之前讲的Dijkstr 阅读全文

posted @ 2022-03-21 15:15 ZheyuHarry 阅读(176) 评论(0) 推荐(1) 编辑

摘要:但是,我们会发现刚刚讲的朴素Dijkstra算法(高情商:朴素 ; 低情商: 低效)的套路不适用于稀疏图,很容易会爆时间; 所以,我们要对其中的一些操作进行优化,首先我们发现找到里起始点最近的点去更新其他的点的时候是O(n)的,又因为是稀疏图我们不能用邻接矩阵来存储,所以我们就会想到用邻接表来存储, 阅读全文

posted @ 2022-03-19 22:24 ZheyuHarry 阅读(302) 评论(0) 推荐(1) 编辑

摘要:我们之前介绍的求最短路问题,我们通常会考虑到用BFS算法计算,这里我们将这样对于求最短路问题用不同的算法进行分类: 思路介绍:Dijkstra算法的思路究竟是怎么样的,我们这里先介绍一下朴素版Dijkstra算法的思路: 因为我们要去计算的是每个节点到起始点的最短距离,所以我们使用的方法是不断地迭代 阅读全文

posted @ 2022-03-19 16:43 ZheyuHarry 阅读(145) 评论(0) 推荐(1) 编辑

摘要:拓扑排序是一种新的图论的方式: 什么是拓扑排序?就是把DAG(Directed Acyclic Graph,有向无环图)的结点按照方向的顺序排序存储起来。因为我们这里说了是有向无环图,所以如果这个图中存在有向环,那么就对应的不存在拓扑排序(toposort),所以我们将采用DFS的方法来实现拓扑排序 阅读全文

posted @ 2022-03-15 19:35 ZheyuHarry 阅读(438) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示