ACM学习
记录ACM 之路
笑遥小哥哥
山坡若陡缓步迈
展开
-
ACM总结二十二
最短路径算法边带有权值的图称为带权图。边的权值可以理解为两点之间的距离。一张图中任意两点间会有不同的路径相连。最短路径就是指连接两点的这些路径中最短的一条。一、求出最短路径的长度以下没有特别说明的话,dis[u][v]表示从u到v最短路径长度,w[u][v]表示连接u,v的边的长度。1.Floyed-Warshall算法 O(N3)简称Floyed(弗洛伊德)算法,是最简单的最短路径算法...原创 2019-05-25 22:57:09 · 119 阅读 · 0 评论 -
ACM总结二十一
图的遍历一、深度优先与广度优先遍历 从图中某一顶点出发系统地访问图中所有顶点,使每个顶点恰好被访问一次,这种运算操作被称为图的遍历。为了避免重复访问某个顶点,可以设一个标志数组visited[i],未访问时值为false,访问一次后就改为true。 图的遍历分为深度优先遍历和广度优先遍历两种方法,两者的时间效率都是O(n*n)。1.深度优先遍历 深度优先遍历与深搜DFS相似,从一个...原创 2019-05-22 23:55:28 · 129 阅读 · 0 评论 -
ACM总结二十
图论,基本概念能理解多少是多少,为以后学数据结构打好基础。图的定义:严格意义上讲,图是一种数据结构,定义为:graph=(V,E)。V是一个非空有限集合,代表顶点(结点),E代表边的集合有向图:图的边有方向,只能按箭头方向从一点到另一点。无向图:图的边没有方向,可以双向。结点的度:无向图中与结点相连的边的数目,称为结点的度。结点的入度:在有向图中,以这个结点为终点的有向边的数目。结点...原创 2019-05-18 23:23:33 · 389 阅读 · 0 评论 -
ACM总结十九
堆的定义堆结构是一种数组对象,它可以被视为一棵完全二叉树。树中每个结点与数组中存放该结点中值的那个元素相对应。堆的性质设数组A的长度为len,二叉树的结点个数为size,size≤len,则A[i]存储二叉树中编号为i的结点值(1≤i≤size),而A[size]以后的元素并不属于相应的堆,树的根为A[1],并且利用完全二叉树的性质,我们很容易求第i个结点的父结点(parent(i))、左孩...原创 2019-05-15 22:54:13 · 130 阅读 · 0 评论 -
ACM总结十八
总结一下二叉树的存储结构和三种遍历“父亲表示法”优点容易找到树根但找孩子需要遍历整个表格“孩子表示法”缺点:只能从父结点遍历到子结点,不能从某个子结点返回到它的父结点。“父亲孩子表示法”一个数据域和二个指针域(一个指向若干个子结点,一个指向父结点)“孩子兄弟表示法”一个数据域和二个指针域(一个指向第一个子结点,另一个指向下一个兄弟结点)先序遍历:访问根节点,遍历左子树,遍历右子树;中序...原创 2019-05-11 23:07:23 · 91 阅读 · 0 评论 -
ACM总结十七
总结一下这几天学的数据结构,数据结构以前也零零散散的接触过,但是没有系统的理解。第一种数据结构,栈,栈是一种只能在某一端插入和删除的特殊线性表。删除和插入都在一端这一端被称为栈顶,另一端被称为栈底,插入一般被称为进栈(栈指针加一),删除被称退栈(栈指针减一)。队列与栈不同,队列在一端删除(出队),在另一端插入(入队)。队列用数组A[m+1]来存储,数组的上界m即是队列的最大容量。队列的运算中需设定...原创 2019-05-08 23:24:43 · 114 阅读 · 0 评论 -
ACM总结十六
这几天做的二分的题很多,三分法的题不是那么多,今天总结一下三分用法。当答案具有可二分性时,我们可以用二分答案来解决。但是,如果要求出凸性函数或凹性函数的最值时,二分就毫无用武之地了,这时,我们就可以用三分法来求出答案。 一个凸性序列/凹性序列通俗的说法就是在该序列最大值/最小值的左边满足不严格单调递增/递减,右边满足不严格单调递减/递增。与二分法类似的是,三分法也先取下界(记作l)和上界(记作r)...原创 2019-05-04 23:06:57 · 86 阅读 · 0 评论 -
ACM总结十五
在做题中发现,二分查找类型的题最关键的两个部分就是查找连续函数和验证条件的函数。验证条件函数就是将当前状态的解与目标解进行比较(或利用当前状态的解判断是否符合条件)。连续查找函数再根据验证条件函数的返回值来判断边界的移动。像题目里给了两个确定的参数求最大值或最小值,如n根网线切成k段求可切成最长长度。这里n和k是确定的参数,最长长度是代求量。利用连续查找函数套用验证函数效率最高。还用一点小技巧也要...原创 2019-05-01 23:10:02 · 110 阅读 · 0 评论 -
ACM总结十四
ACM课进度对我来说将的还是很快,有点跟不上节奏,但是还是要坚持学习,学习一点就要彻底学会,趁放假,把搜索又拿过来仔细看了一下。把搜索的例题拿过来仔细敲了一遍。A Knight’s Journey一开始没读懂到底怎么走的,搜了搜才弄明白了。图片中红色箭头指向的八个方向的空格才是马可以走到的空格。我又按照样例数据三手推才弄明白了走的过程。最后手写了一遍代码,才算是把这道题彻底弄懂。...原创 2019-04-27 22:11:46 · 149 阅读 · 0 评论 -
ACM总结十三
二分法并不是简单的指二分查找,而是一种二分思想。对于某些问题,如果答案具有特定的范围,并且验证答案是否成立的函数具有单调性。则可以在范围内对答案进行二分验证,从而快速确定答案。题目中出现什么的最小值的最大值或最大值的最小值,常常采用二分法解决。在编程时遇到每个数据只有两种状态,且 dfs 或者 bfs 时遍历时间复杂度高时,可以采用二进制压缩数据,尤其是二维数组。...原创 2019-04-24 22:54:41 · 79 阅读 · 0 评论 -
ACM总结十二
在最近几天的学习中对搜索有了更深入的了解,深度搜索,最通俗的理解最近很多大佬给出的走迷宫的例子,一个人没有办法分身,只能沿着一个方向走不达目标,不撞南墙(边界)不回头,到了边界还没有找到答案,再回溯。广度搜索,类似于拾眼镜,一个人趴地下拾眼镜,先以手为半径找,这里深度都是手的半径,广度就是手扫过的范围,没找到就往前爬一爬,到达另一个深度。在做题的时候要处理边界条件和约束条件。...原创 2019-04-20 23:33:25 · 82 阅读 · 0 评论 -
ACM总结十一
搜索概念:利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。算法:在解的空间里,从一个状态转移到其他状态,这样进行下去,将解的空间中的状态遍历,找到答案。深搜:(自己的理解,一直往下层走,走到不能走了,再从上一次的另一个节点往下走。)从初始状态,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任...原创 2019-04-17 23:25:21 · 109 阅读 · 0 评论 -
ACM总结十
递归初理解递归简单来说就是一个函数直接或间接调用自身的一种方法,它通常把一个大复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。知乎里有人给出了很形象的比喻:我们可以把“递归”比喻成“查字典”,当你查一个词,发现这个词的解释中某个词仍然不懂,于是开始查这第二个词。可惜,第二个词仍然有不懂的词,于是查第三个词,这样查下去。直到每一个词的解释都能看懂,那么递归就走到了,然后你开始后退,逐个...原创 2019-04-13 23:15:30 · 109 阅读 · 0 评论 -
ACM总结九
在这里总结一下这几天所学的区间DP。区间DP顾名思义就是先在小区间进行动态规划得到最优解,区间的最优解合并求大区间的最优解。实现的大体思路//mst(dp,0) 初始化DP数组for(int i=1;i<=n;i++){ dp[i][i]=初始值}for(int len=2;len<=n;len++) //区间长度for(int i=1;i<=n;i++...原创 2019-04-10 23:53:58 · 107 阅读 · 0 评论 -
ACM总结八
完全学习总结①与零一背包不同的是,零一背包中的物品是不可以重复拿取的,只可以拿取当前物品或者不拿取当前物品,不可以拿取多个,完全背包的物品是可以任意拿取多个的来构成不超过背包容量并且构成的总价值是最大的② 首先我们是可以使用试探的方式来拿取物品的,对于当前的物品我们可以不拿取,拿取一个,拿取两个…直到不能够拿取当前物品了,这种试探的思维我们是可以使用深度优先搜索来进行解决的,但是时间复杂度可...原创 2019-04-07 12:39:52 · 226 阅读 · 0 评论 -
ACM总结七
这几天学习了一下背包问题,在这里总结一下背包主要的三大类问题:01背包问题这是最基础的背包问题,特点是:每种物品仅有一件,有两种状态放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}只考虑第i件物品的策略(放或不放)完全背包问题...原创 2019-04-03 23:20:37 · 109 阅读 · 0 评论 -
ACM总结六
目前做的题还是不够多,对DP的理解很浅显很片面,找出动态转移方程超难理解,这几天学习了几篇前人的博客结合自己做题的经验在这里总结一下。贪心算法核心是在确定好排序规则后以最快的速度逼近目标,DP核心是以小目标来确定更大的目标,依次类推最后得出最终目标。DP的核心思想DP为什么会快? 无论是DP还是暴力,我们的算法都是在可能解空间内,寻找最优解。 来看钞票问题。暴力做法是枚举所有的可能...原创 2019-03-30 23:01:08 · 166 阅读 · 0 评论 -
ACM总结五
这几天学习了DP动态规划,感觉DP比贪心算法难很多,有很多问题很难马上想出动态转移方程。感觉动态规划里最难的就是动态转移方程。今天总结一下动态规划。动态规划主要解决多阶段问题,就是说每一步都要都要进行决策,这个决策过程就用动态转移方程表示。不同与贪心算法,贪心算法,在一开始就决定一种解决方式(特定的排序方法)全程都使用那一种解决方式就行。而动态规划每一步都要利用动态转移方程重新决策。从而得出全...原创 2019-03-27 23:29:02 · 148 阅读 · 0 评论 -
ACM总结四
贪心算法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。贪心算法对于大部分的优化问题都能产生最优解,但不能总获得整体最优解,通常可以获得近似最优解。该算法存在问题:1). 不能保证求得的最后解是最佳的;2). 不能用来求最大或最小解问题;3)...原创 2019-03-23 23:39:54 · 128 阅读 · 0 评论 -
ACM总结三之贪心算法和优先队列
这两个周学了贪心算法,贪心算法并不是直接去求问题的最优解,而是先求出局部的最优解,从而得出整体的最优解。对于一些贪心中相关联的量,通常使用结构体和map实现关联。贪心中一般也需要排列顺序,用sort,优先队列等排序,也重载排列顺序。优先队列(会自动排序),一个优先队列声明的基本格式是: priority_queue<结构类型> 队列名; priority_queue<int,ve...原创 2019-03-20 23:40:18 · 452 阅读 · 0 评论 -
STL总结二
我对map的理解还是不够深入,咨询了宿舍里的大佬,他们跟我说,map就相当于数组,前面的值是键值,后面的值是实值,前面的是键值相当于数组的下标,而实值相当于数组的元素。拥有一对一的处理能力。map根据键值对元素排序。还进一步学习了结构体。弄懂了结构体的定义和使用,结构体完全相当于自己定义了一种数据类型,用这种数据类型,可以对这种数据类型内的各种数据进行操作,应对几种数据相互关联的情况。...原创 2019-03-16 23:20:12 · 111 阅读 · 0 评论 -
STL总结一
最近学习了STL中的几种堆。queue,队列与优先队列区别在于,队列对于元素无排序,而优先队列则会排序。set容器特点是容器内元素不重复,所以需要去重的地方我们可以使用set容器去重(multiset可以允许元素重复)。还学习了sort(快速排序)和重载排序规则的方法,也学会了按结构体的某种类型对整个结构体排序。在CSDN上更多的了解了map的用法和next-permutation()的用法,这两...原创 2019-03-13 23:44:22 · 83 阅读 · 0 评论 -
STL中map用法学习
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有...转载 2019-03-06 21:09:25 · 133 阅读 · 0 评论