算法学习
文章平均质量分 55
WALL-SQ
Something we got, something we lost
展开
-
Tire树
Tire树的结构为一个root节点,边表示字符,向下延伸。Tire树的构建:struct Node{ bool over;//以这个节点为终点 int path;//有多少个字符串经过 Node *next[26];};void inif(Node *root){ for(int i=0;i<26;i++) root-&...原创 2021-03-18 12:36:24 · 356 阅读 · 0 评论 -
二分图匹配
二分图(二部图):二部图就是可以将它的点划分为两个集合,然后所有的联通线都是连接这两个集合的。匹配:为集合A的某个元素在集合B中找一个元素与它匹配。【过程就类似于相亲之类的】最大匹配:尽可能的将AB中的元素组合成最多的对数。算法:匈牙利算法:基本思路是DFS,在为某个元素分配对象时,如果该对象被占用,试图让占用者去找新对象,若无,则匹配失败。核心代码:#include<...原创 2021-03-11 15:48:30 · 74 阅读 · 0 评论 -
逆序对问题求解
逆序对-如果存在l<r,并且X(l)<X(r),则称为一个逆序对。逆序对的个数等于在朴素稳定排序情况下,相邻数交换的次数。解法1:归并排序如果我们将数组分成两块X(1)~X(i)、X(i+1)~X(n),那么求左边某一个数y的逆序对,就是在求在左部,y的右边有多少数比他小以及在整个右部多少数比他小。那么在归并的时候,这两块已经有序,所以只要用双指针,求出右部有多少数比他小即...原创 2018-08-25 12:17:51 · 9409 阅读 · 0 评论 -
计蒜客 CSP-J2 2020
D. 方格取数【民间数据】只看题面1000ms 262144K设有n \times mn×m的方格图,每个方格中都有一个整数。现有一只小熊,想从图的左上角走到右下角,每一步只能向上、向下或向右走一格,并且不能重复经过已经走过的方格,也不能走出边界。小熊会取走所有经过的方格中的整数,求它能取到的整数之和的最大值。输入格式输入文件名为number.in。第 1 行两个正整数n,mn,m。接下来nn行每行mm个整数,依次代表每个方格中的整数。输出格式输入...原创 2020-11-08 22:37:43 · 589 阅读 · 2 评论 -
常见的算法优化策略(本文的题目推荐在Virtual Judge上提交)
滑动窗口最小值问题输入正整数k和一个长度为n的整数序列,定义f(i)表示从第i个元素开始的连续k个元素中的最小值,要求输出f(1),f(2),...,f(n-k+1)。例如,对于序列5 2 6 8 10 7 4,则f(1)=2,f(2)=2,f(3)=6,f(4)=4。思路:其实这题连续k个元素显然是采用滑动窗口解决问题,因此我们的精力就放在了得到窗口内最小值的问题上。1. 拿到最值很容易想到优先级队列,但是由于优先级队列不能支持随机查找,因此每一个窗口都需要重建一次2. 我们可以使用set原创 2020-11-01 14:12:27 · 651 阅读 · 0 评论 -
大组合数问题
直接采用公式C(n m)=n!/m!(n-m)!#includetypedef long long ll;ll factorial(ll x){if(x==0){return 1;}return x*factorial(x-1);}int main(){ll n,m,p;while(scanf("%lld %lld %lld",&n,原创 2020-09-14 13:05:29 · 1177 阅读 · 1 评论 -
中国剩余定理及扩展
《孙子算经》中有这么个问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?我们可以用如下的同余方程组表示这个问题:原创 2020-09-07 13:40:39 · 251 阅读 · 2 评论 -
倍增算法与ST表
ST应用了倍增的算法,主要用来解决区间最值查询(RMQ)的问题。原创 2020-09-06 19:57:08 · 301 阅读 · 0 评论 -
差分约束系统
差分约束系统是如下一组不等式:原创 2020-09-03 18:27:50 · 168 阅读 · 0 评论 -
最大公约数与欧几里得算法(带扩展)
欧几里得算法:辗转相除法,用来求两个数的最大公约数。【在数学里面最大公约数是没有负的定义的,所以负数是不谈最大公约数的】它是个递归算法,gcd(a,b)=gcd(b,a%b)。证明:设a=x*b+r,设d为a,b的最大公约数,d|a,d|b,可得d|r,那么a%b=r,也就是gcd(a,b)=gcd(b,a%b)。具体代码:int gcd(int a,int b){ if...原创 2020-09-02 10:03:54 · 1241 阅读 · 0 评论 -
树状数组
树状数组其实是在数组上模拟树的结构,一般用于解决区间问题,然而对于区间问题而言,最强大的莫过于线段树了。不过树状数组相比线段树而言,无论是代码量,还是常数都要低很多,因此树状数组还是很有效的。我们用一个求和问题引入树状数组:...原创 2020-08-31 16:36:46 · 337 阅读 · 0 评论 -
二分图匹配-匈牙利算法
二分图概述所谓二分图,就是我们可以将图中所有的点分为A、B两个集合,从而使得集合内部任意两个点都不直接相连。二分图适用于解决一种类似于婚姻匹配的问题,即如果A-B匹配,那么A就不能在和C匹配,即便他们之间有好感。最大匹配二分图的最大匹配即需要给出一种分配策略,使得产生尽可能多的对(就是撮合最多多少对情侣)。匈牙利算法是一个用于解决该类问题的标准算法之一,核心想法是让路:假设你(就是红娘)当前想撮合Bi与Gk,但是Gk已经有了对象Bj,此时红娘就和Bj交涉能否让Bj尝试换一个对象.原创 2020-08-24 11:35:30 · 3514 阅读 · 0 评论 -
图论-最短路问题
最短路旨在解决这样一种问题,在图中,需要知道从点i到点j的路径长度的最小值。松弛操作:在最短路中,我们需要做松弛操作,即当我们能够找到一个点k使得i->j能够通过k做中转变得更小,即满足i->j < i->k + k->j ,此时我们将i->j 更新为i->k + k->j,此为松弛操作。多源最短路Folyd算法:Folyd算法采用动态规划的算法,我们这样抽象问题:在考察n个点的情况下,求i->j的最短路径长度。当我们考察是否能够..原创 2020-08-18 22:32:49 · 750 阅读 · 0 评论 -
原地哈希
原地哈希用来解决这样一种问题:需要一个使得数组尽量有序的方式,并且要求时间复杂度达到O(n)。我们先来看这样一个问题,一个长度为n的数组,所有的数都不相同,且数据的范围为[1,n],如何在O(n)的时间复杂度内完成排序。实际上,我们在做一般排序的时候,是基于数字具体值的大小来决定顺序的,也就是说,数字具体值决定了数字应该去的位置。而这题中的条件:长度为n个数组,所有的数均不相同,不妨我们就让num[i]去到索引为num[i]的位置。实际上,在本题的条件下,num[i]就应该去索引为num[i]的位置原创 2020-08-17 20:24:08 · 2661 阅读 · 0 评论