ACM_算法入门
文章平均质量分 63
purevegetable
这个作者很懒,什么都没留下…
展开
-
floyd算法
void floyd() { for(k=0;k<n;k++) for(i=0;i<n;i++) for(j=0;j<n;j++) A[i][j]=min(A[i][j],A[i][k]+A[k][j]); } 原始代码 Ak(i,j):原创 2013-04-01 10:33:05 · 633 阅读 · 0 评论 -
后缀树
在pongba的讨论组上看到一道Amazon的面试题:找出给定字符串里的最长回文。例子:输入XMADAMYX。则输出MADAM。这道题的流行解法是用后缀树(Suffix Tree)。这坨数据结构最酷的地方是用它能高效解决一大票复杂的字符串编程问题: 在文本T里查询T是否包含子串P(复杂度同流行的KMP相当)。文本T里找出最长重复子串。比如abcdabcefda里abc同da都重复出现,转载 2013-07-23 10:40:12 · 935 阅读 · 0 评论 -
AC自动机
转自:DarkRaven原创http://hi.baidu.com/lightxianjian/blog/item/d0f0b8de8041125095ee3710.html关键字:AC自动机 自动机 有限状态自动机 Trie 字母树 字符串匹配 多串匹配算法Note:阅读本文需要有KMP算法基础,如果你不知道什么是KMP,请看这里:http://www.matrix67.转载 2013-07-18 08:23:46 · 648 阅读 · 0 评论 -
线段树入门
转自:alpc62线段树入门好久没写过算法了,添一个吧,写一个线段树的入门知识,比较大众化。上次在湖大,其中的一道题数据很强,我试了好多种优化都TLE,相信只能用线段树才能过。回来之后暗暗又学了一次线段树,想想好像是第三次学了,像网络流一样每学一次都有新的体会。把问题简化一下:在自然数,且所有的数不大于30000的范围内讨论一个问题:现在已知n条线段,把端点转载 2013-07-21 06:17:04 · 629 阅读 · 0 评论 -
floodfill算法的几种实现
一、4-Way Recursive Method(FloodFill4) //Recursive 4-way floodfill, crashes if recursion stack is full void floodFill4(int x, int y, int newColor, int oldColor) { if(x >= 0 && x = 0转载 2014-07-07 10:48:21 · 1487 阅读 · 0 评论 -
正方形给出2点求另外2点
设AC和BD的交点O的坐标为(X0,Y0),则有: X0=(X1+X3)/2 , Y0=(Y1+Y3)/2 。从图上容易看出:X2-X0=Y3-Y0 , Y2-Y0=X0-X3 ;将X0、Y0代入以上两式,可得:X2=(X1+X3+Y3-Y1)/2 , Y2=(Y1+Y3+X1-X3)/2 。同理可得:X4=(X1+X3-Y3+Y1)/2 ,转载 2014-03-15 09:56:38 · 1122 阅读 · 0 评论 -
最短路SPFA
SPFA算法:求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm,是Bellman-Ford算法0(VE)的一个优化,期望的时间复杂度O(2E),E为图的边数,所以SPFA用在稀疏图上的效果会更加明显。SPFA对Bellman-Ford算法优化的关键之处在于意识到:只有那些在前一遍松弛中改变了距离估计值的点,才可能引起他们的邻接点的距离估计值的改变。转载 2014-02-18 20:22:24 · 712 阅读 · 0 评论 -
KMP 算法
如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假转载 2014-02-20 20:48:00 · 543 阅读 · 0 评论 -
差分约束
网络赛搞得心情非常不好啊。 跟着依然做了几道差分约束,其实就是用最短路来解决不等式问题,也算是个简单的算法吧,需要掌握的便是初始化的技巧,这个在baidu上的解释有点绕口,找学长解释了下,直接秒懂。如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi求解差分约束系统,可以转化成图论的单源最短路径(或最长路径)问题。观察xj-xi例如,考虑这样一个原创 2013-09-20 10:04:37 · 753 阅读 · 0 评论 -
ACM需要学习的算法(最好是依次学)
要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来. 适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红, 发挥自己的长处,这才是重要的. 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打 出来.转载 2013-05-03 19:57:48 · 2036 阅读 · 1 评论 -
sort与qsort的详解
做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件 #include 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就转载 2013-04-02 07:06:25 · 759 阅读 · 0 评论 -
浅谈KMP(易理解)
江湖上被称作“看毛片算法”。 KMP是一种字符串匹配的算法,本来想给题目加个“浅谈”谦虚一下,大神们都喜欢这么做的。但浅谈什么什么的最讨厌了,一般情况下都很难理解。我的估计更 难理解,所以就不加浅谈这两个字了,下面我们来深入探究一下这个问题。之所以叫它KMP,是因为这个东西是K/M/P三个没事研究研究小白鼠的老学究搞出 来的,各个人的名字的首字母凑一块,就有了这个名字,很难想象如果转载 2013-03-28 13:02:55 · 795 阅读 · 0 评论 -
01背包、完全背包(DP)
01背包int n;//物品的个数。int v;//背包容量最原始的01解法int f[n+1][v+1];for(int i=0; i f[0][i]=0;for(int i=1; ifor(int j=0; j{if(j-cost[i]f[i][j] = f[i-1][j];else f[i][j] = f[i-1][j原创 2013-05-01 17:28:31 · 783 阅读 · 0 评论 -
单调递增最长子序列。(详解)
(这算是经典的DP题型了,我竟然差点忘记了,罪不应该啊。)描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3aaaababcabklmncdefg样例输出原创 2013-05-04 17:33:41 · 773 阅读 · 0 评论 -
中国剩余定理(韩信点兵)
现在这网上确实东西杂,看个好点的算法都难啊 公元前后的《孙子算经》中有“物不知数”问题:“今有物不知其数,三三数之余二 ,五五数之余三 ,七七数之余二,问物几何?”答为“23”。 --------这个就是传说中的“中国剩余定理”。 其实题目的意思就是,x%3=2,x%5=3,x%6=2;问x最小是多少? 解法: 1.首先找到3,5,7,的三个“关原创 2013-05-20 13:34:40 · 1331 阅读 · 0 评论 -
A*算法详解
A算法详解 GCP{Z]u )]c]el@y (c(-E|u. |,Tr1[ 相应例题:http://blog.sina.com.cn/s/blog_691ce2b701017fe3.html第一部分:A*算法简介 IFd )OZ5 写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点实在太少,我在这里 抛砖引玉,希望大家都转载 2013-03-21 19:06:14 · 1489 阅读 · 0 评论 -
Kruskal算法
Kruskal算法的主要思想就是先用一个数组将边进行存储,然后按权的大小进行排序;然后一次向后找,(运用并查集)看边的2个结点是否处在一个集合 如果是则直接进入下一次,不是的话则将2个结点所处的集合连接起来,加上这条边,一直到合法边的数目为n-1时,整个算法结束。#include#define N 200using namespace std;typedef struct{int d原创 2013-03-26 10:53:19 · 886 阅读 · 0 评论 -
KMP算法及其优化
#include #include using namespace std; void get_next(char* p, int* next) { int i, j; i = 0; j = -1; next[0] = -1; while原创 2013-03-30 08:47:46 · 716 阅读 · 0 评论 -
树形DP 入门资料
树形DP二叉苹果树(ural 1108) 题目意思:有一棵苹果树,苹果树的是一棵二叉树,共N个节点,树节点编号为1~N,编号为1的节点为树根,边可理解为树的分枝,每个分支都长着若干个苹果,现在要要求减去若干个分支,保留M个分支,要求这M个分支的苹果数量最多。 输入:N M接下来的N-1行是树的边,和该边的苹果数N and M (1 ≤ M 输出:剩余苹果的最转载 2013-07-18 08:22:16 · 1273 阅读 · 0 评论