
算法笔记
无名蒟蒻
苟利国家生死以,岂因祸福避趋之
展开
-
RMQ
“RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j”——某百科看完上面这段文字,我们就可以知道所谓RMQ的作用了。它是一种求区间最值的算法。简单回忆一下,平时我们求区间最值的时候是怎么做的呢?对于一般的选手,在没有学过RMQ之前,一般都会第一时间想到用朴素的方法去解决,也就是:# include #def原创 2016-08-07 11:08:39 · 351 阅读 · 0 评论 -
kmp匹配算法
(本文整理自讲义及自己的笔记,如有错误之处请指出)注意:在本文中,我们将使用始于零的数组来表示我们的字符串。所以在下面例子中,我们用S[2]来表示字符串S中的第三个字符。这种表示遵从C++语言的语法。 KMP算法可在一个主“文本字符串”S内查找一个“词”W的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。 —原创 2016-08-07 08:24:51 · 750 阅读 · 0 评论 -
最小生成树(prim算法)
在实际生活中我们常常会遇到这样一些问题:有若干个需要连接的点(不妨假设为一些村庄)和若干条连接着两个点的边(在村庄间修公路),而这些边会有不同的权值(可设为修路所需的费用不同)。现在要连通这些所有的点,并使权值和最小。这类问题在现实生活中很广泛,如修公路、架设电网,等等。在信息学竞赛中,这种问题有专门的称谓“最小生成树”(Minimum Spanning Tree,简称MST)。今天介绍一下MST原创 2016-08-07 11:09:12 · 1521 阅读 · 0 评论 -
最小生成树(kruskal算法)
问题:详见最小生成树之prim算法算法描述:前提条件:MST一定无环,以确保不产生浪费。每次选择一条权最小的边e。若将e加入MST中会产生环,则放弃e;否则将e加入MST中。如果已经加了N-1条边,结束;否则执行2。怎么判断是否形成环?可以用并查集实现。将已选的顶点放入一个集合中,若当前边e的两个顶点一个在集合内,一个在集合外则说明不会形成环。时间复杂度:O(|e|log2|e|)这里给出一个例子原创 2016-08-07 11:09:15 · 291 阅读 · 0 评论 -
Dijkstra算法
【最短路径问题】对在权图G=(V,E),从一个源点s到汇点t有很多路径,其中路径上权和最少的路径,称从s到t的最短路径。【三角形定理&松弛】我们知道三角形的特性:任意两边之和大于第三边。因此,在求解过程中,若对于顶点x和顶点y不符合该特性,即可对它们进行“松弛”。//设dis[x]为源点s到顶点x的最短距离// adj[x][y]为顶点x、y之间的距离dis[y]=min(dis[y],dis[原创 2016-08-07 11:09:28 · 381 阅读 · 0 评论 -
manacher算法(寻找最长回文)
考虑这样的一个最长回文子串问题:给定一个长度为nn的字符串SS现在要从中找出一个回文的子串TT字符串AA是回文的,当且仅当AA反转后的A′A’和AA完全相等。问TT可能的最大长度。容易想到直观的暴力算法,枚举所有的子串并逐一判断,时间复杂度为Θ(n3)\Theta(n^3)。但可以注意到,回文串必然有一个“中心”,且整个串是关于这个中心左右对称的,因此一个长度大于2的回文串中必有一个更短的原创 2016-08-07 11:47:33 · 1390 阅读 · 0 评论 -
扩展kmp算法
考虑如下的问题:给出一个长度nn的字符串S0..n−1S_{0..n-1}和一个长度mm的字符串T0..m−1T_{0..m-1}问SS的哪个后缀和TT具有最长的公共前缀(Longest Common Prefix,以下简称LCP)让我们来简单分析一下,暴力做法就是枚举SS的每一个后缀和TT匹配,时间复杂度是Θ(nm)\Theta(nm)。这个做法中,主要是重复运算拖慢了速度,效率不高。首先原创 2016-08-12 18:32:00 · 476 阅读 · 0 评论 -
状态压缩 DP 入门课堂笔记
状态压缩型动态规划是一种实用的算法。顾名思义,它的优点就在于能够将一些可以表示为非 0 即 1 的状态进行压缩,从而大大节省了空间。说白了,状压 DP 就是利用了“位”的关系。因此位运算和集合的一些相关内容是学习状压 DP 必不可少的预备知识。原创 2017-04-11 16:06:20 · 286 阅读 · 0 评论 -
树型 DP 入门课堂笔记
所谓“树型DP”,顾名思义,是在树上做的 DP。原创 2017-04-18 18:36:28 · 404 阅读 · 2 评论 -
Hash 入门课堂笔记
结合 lgj 的讲课和自己的理解随便写写,如有不当之处请指出。原创 2017-04-20 07:53:33 · 379 阅读 · 0 评论 -
强连通分量 Tarjan 算法入门笔记
强连通分量在图论问题中得到广泛的应用,往往可以将有向图缩点,得到一个 DAG,于是避免了原图中可能有环造成后效性,可以在上面进行动态规划求解。 显然强连通分量是只针对于有向图而言的。对于一个连通的无向图,它本身就是一个连通分量。原创 2017-04-27 11:12:11 · 391 阅读 · 0 评论 -
最长上升子序列问题的几种解法
先说点题外话:为了期末考试备战,好久没碰OI了,博客荒废了三周。一心全力备考,结果还是差之毫厘失之千里。放假之后因为考砸颓了两天,来创新班之后精神终于好多了。言归正传。最长上升子序列问题是信息学竞赛中的经典问题。为了方便,我们约定,取它的英文Longest Increasing Subsequence的首字母缩写LIS代称之。LIS问题的大意是:有一个长度为n的数字序列,求它的所有子序列中长度最大原创 2016-08-07 11:09:23 · 714 阅读 · 0 评论 -
最大流、最小割小结
网络流问题博大精深,目前我们只学习了其中的一点皮毛,初步认识了最大流问题及其 Edmonds-Karp 算法,了解最小割与最大流之间的联系,初步掌握了利用最大流解决某些二分图匹配问题的方法,因此在这里就谈谈我对网络流的理解。原创 2017-08-13 20:07:45 · 3318 阅读 · 0 评论