![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法归纳与总结
文章平均质量分 72
XDU_Skyline
Everything is over, everything is just beginning.
展开
-
动态规划小结——最优配对问题
1.说明:紫书上的最优配对问题的代码(P284)有问题,下面把完整的代码贴出来。注意把d[0]初始化为0才行,n一定要是偶数。2.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include#include#include#include#include#include#include#incl原创 2015-02-16 13:49:01 · 831 阅读 · 0 评论 -
搜索专题小结:迭代加深搜索
迭代加深搜索迭代加深搜索(Iterative Deepening Depth-First Search, IDDFS)经常用于理论上解答树深度上没有上界的问题,这类问题通常要求出满足某些条件时的解即可。比如在“埃及分数”问题中要求将一个分数a/b分解成为若干个形如1/d的加数之和,而且加数越少越好,如果加数个数相同,那么最小的分数越大越好。下面总结一下该方法的一般流程:(1)概述:迭代加深原创 2015-04-11 20:31:07 · 9167 阅读 · 1 评论 -
图论专题小结:最短路算法
1.Dijkstra算法(适用于边权为正的图)(1)概述:该算法可以计算正权图的单源最短路,即从一个单个源点出发,到所有结点的最短路。伪代码如下: 清除所有点的标号 设d[0]=0,其他d[i]=INF 循环n次 { 在所有未标号的结点中,选出d值最小的结点x原创 2015-02-28 23:01:16 · 814 阅读 · 0 评论 -
数据结构专题小结:并查集
并查集并查集的作用是快速判断两个数是否属于同一类的数据结构,不过除此之外,它还可以实现合并u和v所在的组。下面给出并查集的一系列操作的实现。一,初始化原创 2015-04-07 00:08:14 · 786 阅读 · 0 评论 -
图论专题小结:拓扑排序
拓扑排序拓扑排序是针对有向图进行的,拓扑排序有两个作用:(1)针对某种定义好的“小于”关系为结点排序;(2)判断一个有向图中是否存在有向环。我们可以利用DFS来完成拓扑排序。下面是判断一个有向图g中是否含有有向环的代码:#define N 100+10int c[N], g[N][N];//利用二维数组g保存有向图int n;//结点数,下标从0开始bool toposort(原创 2015-04-02 16:42:49 · 889 阅读 · 0 评论 -
图论算法小结:欧拉回路
欧拉回路欧拉回路是指在一个图G中,从起点s出发,不重复地经过所有边后又返回到起点s的一条路径。同样还有关于欧拉道路的定义,不过起点和终点不一定重合,但都是不重复地经过图中的每一条边。判断一个图中是否存在欧拉回路(道路)通过以下条件来判断:(1)如果图G是一个无向图,那么度数为奇数的点不能超过两个,且这两个点其中一个作为起点,另一个作为终点。如果度数均为偶数,那么所有点均可以作为起点或终原创 2015-04-08 23:20:47 · 1437 阅读 · 0 评论 -
图论算法小结:次短路的求解
利用Dijkstra算法求解次短路我们曾经学过利用Dijkstra算法求解最短路,但是如果要求解某一个结点的次短路该怎么做呢?实际上,我们仍然可以用Dijkstra算法来求解它。首先来回顾一下Dijkstra算法的原理:首先把所有结点的最短距离设置为无穷大,然后令d[0]=0。接下来,每次都找到最短路已经确定的经典,更新从它出发的相邻结点的最短距离。以后我们不再考虑最短距离已经确定原创 2015-04-07 17:53:03 · 7501 阅读 · 3 评论 -
动态规划专题小结:四边形不等式优化
今天第一次学习四边形不等式优化dp,感觉优化效果十分给力,不过数学味道比较浓重,证明比较复杂。因此这里删繁就简,给出关于四边形不等式优化必须要明白的地方,以后直接套用条件即可。四边形不等式优化条件在动态规划中,经常遇到形如下式的转台转移方程:m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max)上述的m(i,j)表示区间[i,j原创 2015-05-15 22:36:54 · 12146 阅读 · 4 评论 -
动态规划专题小结:最长上升子序列(LIS)问题
(1)问题描述:给定n个整数A1,A2,A3...An。按照从左往右的顺序选择尽可能多的整数,组成一个上升子序列,其中相邻元素不能相等。(2)解题思路:本题就是经典的最长上升子序列问题(Longest Increasing Subsequence,LIS)。可以通过动态规划解决。定义状态d(i)表示以下标i结尾的LIS的最大长度。那么不难得到如下状态转移方程:d(i)=max{0,d(j)原创 2015-05-15 21:55:27 · 3098 阅读 · 1 评论 -
“埃及分数”问题浅谈对迭代加深搜索的理解
迭代加深搜索(IDDFS)的思想迭代加深搜索一般用来求解状态树“非常深”,甚至深度可能趋于无穷,但是“目标状态浅”的问题。如果用普通的DFS去求解,往往效率不够高。此时我们可以对DFS进行一些改进。最直观的一种办法是增加一个搜索的最大深度maxd,一般是从1开始。每次搜索都要在maxd深度之内进行,如果没有找到解,就继续增大maxd,直到成功找到解,然后break。如下图所示,如果原创 2015-08-09 17:01:56 · 2274 阅读 · 0 评论 -
常用字符串Hash函数
几个常用的字符串Hash函数如下:SDBMHash函数unsigned int SDBMHash(char *str){ unsigned int hash = 0; while (*str) { // equivalent to: hash = 65599*hash + (*str++); hash = (*str++) +原创 2015-08-10 13:35:08 · 1742 阅读 · 0 评论 -
DLX算法求解精确覆盖问题
在网上看到一篇非常好的介绍舞蹈链的文章,转载之。1.原文链接:点击打开链接2.跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1例如:如下的矩阵就包含了这样一个集合(第1、4、5行) 如何利用给定的矩阵求出相应的行的集合呢?我们采用回溯法转载 2015-08-12 08:44:58 · 3128 阅读 · 3 评论 -
以“遥远的银河”为例浅谈扫描和信息维护的技巧
题目链接:点击打开链接题目描述:给出平面上n个点,找一个矩形,使得边界上包含尽量多的点。 看到这样一道题,猛一下真的觉得无从下手,上来能够想到的办法就是枚举上下边界,然后再枚举左右边界,然后统计点数。复杂度是O(n5)。显然无法承受。 因此,我们需要一点点仔细的分析,试图将这个问题往以前做过的类似的问题上转化。相似度最高的问题就是“最大连续和问题”,里面用到了一个“原创 2015-08-16 17:11:40 · 951 阅读 · 0 评论 -
利用分治法解决棋盘覆盖问题
1.问题描述:点击打开链接2.代码:#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#i原创 2015-08-18 16:43:39 · 2100 阅读 · 0 评论 -
贪心算法专题小结——区间相关问题
贪心算法是一种高效算法,可以快速得到问题的答案。如果一个问题可以用贪心法解决,那么它必须具备2条性质:1.具有最优子结构(即问题的最优解包含了子问题的最优解),2.具有贪心选择性质(即可以通过做出局部最优选择来构造全局最优)。下面总结一下基于贪心算法的区间问题。一,选择不相交区间1.问题描述:数轴上有n个开区间(Ai,Bi),选择尽量多个区间,使得这些区间两两没有公共点。样例输原创 2015-08-18 19:25:31 · 2112 阅读 · 0 评论 -
暴力搜索专题小结:全排列及可重集排列生成算法
1~n的全排列(1)思路:按照递归的思想,初始化集合S中含有1~n所有元素。如果1~n的集合S为空,那么输出全排列;否则从小到大依次考虑每个元素i,在A的末尾添加i后,集合S变为S-{i}。这里我们不需要集合S,只需要利用一个变量cur表示当前位要填的数即可。那么A中没有出现过的元素均可以选择。#define N 100int A[N];void print_permutation(i原创 2015-04-05 16:55:22 · 1768 阅读 · 0 评论 -
图论专题小结:最小费用最大流算法
一,给定流量F,求最小费用题意:网络中有两台计算机s,t。现在每秒钟要从s到t传输大小为F的数据到t。该网络中一共有N台计算机,其中有一些靠单向电缆相连接每条电缆用(from,to,cap,cost)表示从from发送给to,最大容量是cap,单位传输费用是cost。问传输数据最小的花费是多少?解决最小费用流的一般思路是:每次都沿着最短路进行增广,增广一次之后累加本次增广的总费用,原创 2015-03-04 14:40:55 · 13874 阅读 · 2 评论 -
数值问题专题小结:自适应辛普森算法求定积分
三点辛普森公式该公式要求f(x)必须是一个全局函数,用它可以近似的来求解一个定积分,但精度不够高。因此衍生出一个重要的“变种”,称为“自适应辛普森法”。自适应辛普森法(1)概述:自适应辛普森法(Adaptive Simpson's Rule)是一种数值积分方法,适用于无法求出原函数时的定积分。比直接用辛普森公式的精度更高,而且效率也可观。(2)原理:该算原创 2015-03-17 16:41:46 · 11648 阅读 · 1 评论 -
动态规划小结——背包问题
背包问题是动态规划的经典问题,因此,有必要弄清跟背包问题的所有分析过程并熟练掌握各种类型的代码一,完全背包问题1.问题描述:有n种物品,每种物品有无限多个,第i个物品重量是wi,价值是vi,从这些物品中挑选总重量不超过W的物品,求出挑选物品价值的最大值。 限制条件:1≤n≤100,1≤wi,vi≤100,1≤W≤100002.解题思路:本题类似于“硬币问题”,硬币问题只要求凑够原创 2015-02-12 12:24:58 · 1215 阅读 · 0 评论 -
数论专题小结:欧拉函数
1.n的欧拉函数int euler_phi(int n){ int m = (int)sqrt(n + 0.5); int ans = n; for (int i = 2; i <= m;i++) if (n%i == 0) { ans = ans / i*(i - 1);//注意要先除后乘 while (n%i == 0) n /= i; } if (n > 1原创 2015-02-27 18:24:06 · 542 阅读 · 0 评论 -
数论专题小结:gcd算法与exgcd算法
1.gcd算法int gcd(int a, int b){ return b == 0 ? a : gcd(b, a%b);}2.扩展gcd算法void exgcd(int a, int b, int&d, int&x, int&y)//d是最大公约数,x,y是ax+by=d的一组解{ if (!b){ x = 1, y = 0, d = a; } else { ex原创 2015-02-27 17:24:24 · 591 阅读 · 0 评论 -
图论专题小结:最小生成树算法
Kruskal算法(1)算法概述:第一步先将所有边按照权值从小到大排序,接下来从小到大考察每条边(u,v)。情况一:u和v在同一个连通分量,此时加入(u,v)会形成环,因此不能选择。情况二:u和v不在同一个连通分量,那么加入(u,v)后一定是最优的。注:查找u,v是否在同一个连通分量时使用并查集,会加快查找速度。#define N 1000int p[N];int u[N]原创 2015-02-27 19:30:14 · 592 阅读 · 0 评论 -
数论专题小结:素数筛法
Eratothenes筛法注:时间复杂度为O(N*logN)。#define N 1000int vis[N];vectorprimes;void init()//一般用于打表{ int m = sqrt(N + 0.5); for (int i = 2; i <= m;i++) if (!vis[i]) for (int j = i*i; j <= N; j += i)原创 2015-02-27 18:30:20 · 756 阅读 · 0 评论 -
图论专题小结:无根树转有根树
1.题意:输入一个n个结点的无根树的各条边,并指定一个根结点,要求把该树转化为有根树,输出各个节点的父节点编号。n≤10^6。2.思路:用vector数组存放每个结点的相邻结点,vector与n成正比。#define N 1000000+10vectorG[N];int p[N];int n;void read_tree(){ int u, v; scanf("%d", &n原创 2015-02-27 18:33:12 · 3589 阅读 · 0 评论 -
图论算法小结:网络流及其算法
个人说明:最近学到了图论算法,但网络流这部分颇难理解,于是在网上找到了一片比较好的讲解博客。转载之~网络流(Network Flow) 将每条有向边想象成传输物质的管道。每个管道都有一个固定的容量,可以看作是物质能流经该管道的最大速度(譬如可以想象为水流和河槽)。顶点是管道间的连接点,除了源点(S,Source)和汇点(T,Targe转载 2015-03-01 23:02:28 · 4240 阅读 · 1 评论 -
字符串专题小结:Manacher算法求最长回文串
思路:资料来源网络 参见(有改动):http://www.felix021.com/blog/read.php?2040这道题是一道经典的Manacher算法讲解题目,Manacher是时间复杂度为O(n)的算法。比起蛮力法:对于O(n)的每一个点,都扫描该点的左右对称点,这种方法效率显然是O(n^2)的算法巧妙之处:首先用一个非常巧妙的方式转载 2015-03-15 09:25:20 · 543 阅读 · 0 评论 -
Codeblocks使用技巧汇总
说明:以前经常用Visual Studio编程,用户体验果然是超赞,但是考虑到将来参加比赛时候没有VS可以使用,所以还是从现在开始改用Codeblocks吧。当然,工欲善其事,必先利其器。第一步学习Codeblocks的基础操作以及一些使用技巧是必须的。下面把这段时间学到的小技巧汇总如下:注:标有绿色的地方是推荐经常使用的技巧1.日常编辑按住Ctrl并滚滚轮会放大缩小文本。原创 2015-03-03 16:22:43 · 9038 阅读 · 3 评论 -
集合的表示及其运算
说明:当状态的维数比较多,但每个维数都只有两种情况时,可以考虑用集合来表示。下面来说明集合的表示及其运算。一,集合的表示及基本操作C语言中集合采用二进制码来表示,相当于将集合编码成一个整数。利用公式f(S)=∑2^i(i∈S)即可将集合编码成为一个整数。下面假设集合中一共有n个元素,编号从0开始。空集:0全集:(1只含有第i个元素的集合{i}:1判断第i个元素是否属于集合{0,1…原创 2015-03-07 16:09:06 · 4397 阅读 · 2 评论 -
数论专题小结:取模运算模板
1.大整数取模(1)题意:输入正整数n,m,输出n mod m的值。n≤10^100,m≤10^9。(2)思路:把大整数拆开,逐步取模。#define N 1000+10char n[N];int m;int main(){ scanf("%s%d", n, &m); int len = strlen(n); int ans = 0; for (int i = 0; i原创 2015-02-27 17:28:26 · 1755 阅读 · 1 评论 -
数据结构专题小结:RMQ问题
RMQ问题范围最小值问题(Range Minimum Query)是指:给定一个n个元素的数组A[1],A[2]...A[n]。设计一个数据结构,支持查询操作Query(L,R):计算min{A[L],A[L+1]...A[R]}。该问题在实践中常用Tarjan的Sparse-Table算法。它的预处理时间是O(N*logN),但查询只需要O(1),而且常数非常小。最重要的是,这个算法非常原创 2015-03-19 17:09:27 · 815 阅读 · 0 评论 -
图论专题小结:最大流算法之ISAP算法
ISAP算法ISAP(Improved Shortest Augument Path)算法是改进版的SAP算法,如果对效率要求很高的时候,可以用该算法。(1)概述:算法基于这样的一个事实:每次增广之后,任意结点到汇点(在残余网络中)的最短距离都不会减小。这样,我们可以利用d[i[表示结点i到汇点的距离的下界。然后再增广过程当中不断地修改这个下界。增广的时候和Dinic算法类似,只允许沿着d原创 2015-03-03 22:43:03 · 4228 阅读 · 2 评论 -
图论专题小结:最大流算法之Dinic算法
在《算法竞赛入门经典(第二版)》中介绍了Edmonds-Karp算法,这种算法虽然易于理解但效率不够高,无法满足竞赛的需求。因此这里给出效率比较快一点的Dinic算法。Dinic算法(1)概述:Dinic算法的思路是这样的:每次都不停地用BFS来构造“层次图”,然后用“阻塞流”来增广。这里我特别标出了两个关键词——层次图,阻塞流。什么是层次图呢?假设在残余网络中,起点到结点u的距离是d原创 2015-03-03 16:48:50 · 6397 阅读 · 0 评论 -
数学专题小结:FFT算法
快速傅里叶变换(FFT,Fast Fourier Transform)是信号处理的常用手段,可以把时域信号变成频域信号,时域的卷积运算对应于频域就成了简单的乘法运算。由于两个多项式的乘积,其系数的运算实际上也是一种卷积运算,因此可以用FFT来计算多项式的乘法。网上关于FFT算法的讲解大多都是工程领域的,这里从算法竞赛的角度来剖析一下怎么简洁而高效的实现FFT。一,为什么要用FFT来计算原创 2015-09-02 21:43:20 · 10208 阅读 · 1 评论