算法
adolph_jun
这个作者很懒,什么都没留下…
展开
-
算法入门
算法入门转载 2015-07-26 10:35:10 · 290 阅读 · 0 评论 -
康托展开及其逆运算
展开式 X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,a为整数,并且0 {1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按从小到大排列一共6个。123 132 213 231 312 321 。 代表的数字 1 2 3 4原创 2015-07-07 11:17:45 · 289 阅读 · 0 评论 -
杭电2037
本题是一道贪心算法的题目,这是属于贪心重的选择不相交区间,具体的内容这里不提,就讲下这道题的解题思路。解决这类问题第一步排序,对时间的开头与结尾储存用两个数组分别a[ i ] , b[ j ]表示,对b[ j ]进行从小到大的排序,当对b数组进行排序时,对应的a也发生变化。当两个b相等时,根据a的大小对b进行排序。对b排好后,用b[j]与b[j]后的每个a[i]进行比较,如果a[i]>=b[j原创 2015-05-10 20:37:33 · 737 阅读 · 0 评论 -
博弈
原文链接以下是我从网上收集的关于组合博弈的资料汇总:有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物转载 2015-11-01 22:29:47 · 361 阅读 · 0 评论 -
线段树初学
线段树就是像下图的一种特殊的数,有存储,查询,修改等操作需要用到struct Node{int l,r;//存储边界值 int dt;//存储该区间需改变的值的和 int vis;//需要修改的值 Node *leftchild;Node *rightchild;}; 线段树的操作主要分为两种: 1,对单个区间存储数值原创 2015-11-01 00:50:33 · 253 阅读 · 0 评论 -
欧拉回路
一,定理及推论1,无向图存在欧拉通路的充要条件,为连通图,仅存在两个奇度节点,或无奇度结点原创 2015-10-31 12:37:14 · 436 阅读 · 0 评论 -
图的三种存储方式
一.图的简介 图是计算机中比较重要的一种数据结构,在很多方面应用比较广泛比如:计算机网络中的路由算法,地图上搜索最短路径,搜索引擎等方面。当然图也是比较难理解的一种数据结构,数据结构之所以难是因为它将逻辑结构存储在计算机物理内存中比较难。 二.图的存储 数据结构其实就是存储+算法。算法是依赖于存储结构的(这里可能有异议,有的人觉得算法独立于存储)。下面探讨转载 2015-08-10 13:22:20 · 21715 阅读 · 0 评论 -
求最短路的相关方法
原文链接(一)dijkstra,邻接矩阵所有边权均为正,不管有没有环,求单个源点出发,到所有节点的最短路。该方法同时适用于有向图和无向图。[cpp] view plaincopy#include #include #include using namespace std; const转载 2015-08-04 10:36:45 · 481 阅读 · 0 评论 -
小数化分数
相关链接:看看,了解更多整数化小数,不循环的小数容易化。对于循环小数化分数原理如下:⑴ 把0.4747……和0.33……化成分数。例1: 0.4747……×100=47.4747…… 0.4747……×100-0.4747……=47.4747……-0.4747……(100-1)×0.4747……=47即99×0.4747…… =47 那么原创 2015-11-22 10:31:13 · 466 阅读 · 0 评论 -
数论总结
原文链接1、本原勾股数:概念:一个三元组(a,b,c),其中a,b,c没有公因数而且满足:a^2+b^2=c^2首先,这种本原勾股数的个数是无限的,而且构造的条件满足:a=s*t,b=(s^2-t^2)/2,c=(s^2+t^2)/2其中s>t>=1是任意没有公因数的奇数!由以上概念就可以导出任意一个本原勾股数组。 2、素数计数(素数转载 2015-11-08 22:35:18 · 365 阅读 · 0 评论 -
GCD相关知识
扩展欧几里德算法-求解不定方程,线性同余方程。 设过s步后两青蛙相遇,则必满足以下等式: (x+m*s)-(y+n*s)=k*l(k=0,1,2....) 稍微变一下形得: (n-m)*s+k*l=x-y令n-m=a,k=b,x-y=c,即 a*s+b*l=c 只要上式存在整数解,则两青蛙能相遇,否则不能。 首先想到的一个方法是用两次for转载 2015-10-31 00:01:22 · 326 阅读 · 0 评论 -
最小公倍数与最大公约数
一,最大公约数求法:a.辗转相除 b.等值法(更相减法)辗转相除法int as(int a,int b){ int t,c,k; c=a%b; if (c==0) return b; else { a=c; if (b>a) { t=a; a=b; b=t;原创 2015-11-18 17:36:37 · 245 阅读 · 0 评论 -
求三角形面积
1.已知三边球三角形面积已知三角形的三边分别是a、b、c,(海伦公式)先算出周长的一半s=1/2(a+b+c)则该三角形面积S=根号[s(s-a)(s-b)(s-c)]2.已知三点坐标求三角形面积利用点距离公式求出三边长,再利用 1 中公式计算原创 2015-07-07 21:40:39 · 571 阅读 · 0 评论 -
算法学习-rmq
具体的算法讲解可以看看大神的,个人觉得写得非常好大神讲课自己看完写了一下,并没有完全理解透#include#include#include#includeusing namespace std;int main(){ int f[20][20]; int num[20]; int i,j,k;转载 2016-03-26 11:33:28 · 243 阅读 · 0 评论 -
求素数
素数筛法是这样的: 1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false. 2.然后: for( i=3; i for( j=i+i; j 3.最后输出bool数组中的值为true的单元的下标,就是所求的n以内的素数了。 原理很简单,就是当i转载 2015-07-06 22:05:14 · 398 阅读 · 0 评论 -
背包九讲
点击打开链接转载 2015-07-26 10:31:13 · 273 阅读 · 0 评论 -
推广的欧几里德算法(求最大公约数和乘法逆元)
欧几里德算法欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设转载 2015-07-06 20:55:39 · 2322 阅读 · 0 评论 -
优先队列的使用方法
原文链接C++优先队列的基本使用方法 #include#include#includeusing namespace std;struct node{ friend bool operator { return n1.priority "为从小打到排列 } int priority;转载 2015-08-05 13:50:35 · 302 阅读 · 0 评论 -
最短路归纳
一floyd求多源、无负权边的最短路,用矩阵记录图松弛每一对点,使得每一对点之间的权值是最小的,利用三个for循环,时间复杂度O(n^3)void make_floyd(){ for (k=0; k for (i=0; i for (j=0; j {原创 2015-10-19 23:59:29 · 428 阅读 · 0 评论 -
树状数组
原文链接树状数组中用的d【】,每个点都有一定的管辖范围;如d[1]=a[1];d[2]=a[1]+a[2];d[3]=a[3];d[4]=a[1]+a[2]+a[3]+a[4];等等;这样的结构关键是为了,对一个数组内部动态的删除,增加,来高效的求某个点或者某个区间的值;比如说对数组a,改变某一位的值需O(1),求某个转载 2015-10-07 11:27:14 · 237 阅读 · 0 评论 -
最大子序列和
原文链接问题: 给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到转载 2015-10-08 19:48:54 · 259 阅读 · 0 评论 -
SPFA算法
是一种求单源最短路的算法算法中需要用到的主要变量int n; //表示n个点,从1到n标号int s,t; //s为源点,t为终点int d[N]; //d[i]表示源点s到点i的最短路int p[N]; //记录路径(或者说记录前驱)queue q; //一个队列,用STL实现,当然可有手打队列,无所谓bool vis[N];转载 2015-09-23 00:18:25 · 251 阅读 · 0 评论 -
最长回文串
原文字符。例如:原串:abaab新串:#a#b#a#a#b#这样一来,原来的奇数长度回文串还是奇数长度,偶数长度的也变成以‘#’为中心奇数回文串了。接下来就是算法的中心思想,用一个辅助数组P 记录以每个字符为中心的最长回文半径,也就是P[i]记录以Str[i]字符为中心的最长回文串半径。P[i]最小为1,此时回文串为Str[i]本身。我们可以对上述例子写出其P转载 2015-10-14 21:06:44 · 480 阅读 · 0 评论 -
算法第一节-最短路
一、最短路可以分为以下四种情形1、求单源最短路径(边得权值为非负):固定一个顶点为源点,求源点到其他每个顶点的最短路径----Dijkstra算法2、求单源最短路径(边的权值可以为负,但是不存在负权值回路)----Bellman-Ford算法3、Bellman-Ford算法的改进----SPFA算法4、求所有顶点之间的最短路径(边的权值可以为负,但是不存在负权值回路)----Flo原创 2016-03-24 00:21:16 · 236 阅读 · 0 评论 -
素数打表
#include#includeint a[1000000];int prim(int n){ int i,j; for (i=2; i { if (!a[i]) { for (j=i+i; j原创 2015-12-23 21:55:41 · 222 阅读 · 0 评论