算法
文章平均质量分 76
zhumawinnner
这个作者很懒,什么都没留下…
展开
-
BFS—POJ3414-Pots
较原文有两处改动:1)以二维数组代替map,更简洁有效 2)输出操作过程,改进后更容易理解(原文好像也是对的,但是说不通)原文地址POJ3414-Pots#include#include#includeusing namespace std;int v1,v2; //两个瓶子的容量int c; //目标残余水量bool vist[101][101];in原创 2015-04-09 23:39:25 · 379 阅读 · 0 评论 -
Prim算法和Kruskal算法
2.代码如下(与 Dijkstra算法的差别非常非常小)void DijkstraPath(MGraph g,int *dist,int *path,int v0) //v0表示源顶点 { int i,j,k; bool *visited=(bool *)malloc(siz原创 2015-01-10 16:58:54 · 563 阅读 · 0 评论 -
基于接缝裁剪的图像压缩
题目出自《算法导论》P234,T15-8给定一副彩色图像,它由一个mxn的像素数组A[1..m,1..n]构成,每个像素是一个红绿蓝(RGB)亮度的三元组。假定我们希望轻度压缩这幅图像。具体地,我们希望从每一行中删除一个像素,使得图像变窄一个像素。但为了避免影响视觉效果,我们要求相邻两行中删除的像素必须位于同一列或相邻列。也就是说,删除的像素构成从顶端行到底端行的一条“接缝”(seam),相邻原创 2015-03-10 14:53:40 · 1468 阅读 · 1 评论 -
石子合并问题(动归)
【石子合并】 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。 【输入文件】 包含两行,第1 行是正整数n(1 第2行有n个数,分别表示每堆石子的个数。 【输出文件】 输出两行。 第1转载 2015-01-31 21:43:12 · 1104 阅读 · 0 评论 -
背包问题的应用
Description:话说月光家里有许多玩具,最近他又看上了DK新买的“擎天柱”,就想用自己的跟DK的换。每种玩具都有特定的价格,价格为整数。只有月光拿出的玩具的总价格与“擎天柱”的价格相等才能换得“擎天柱”。同时,月光还希望能用最少的玩具数换回“擎天柱”。请问,月光能顺利得到梦寐以求的“擎天柱”吗?Input:输入数据包含多组;对于每组数据,第一行为一个正整数n(1 ≤n≤10原创 2015-02-05 16:27:32 · 1392 阅读 · 0 评论 -
寻找数组第二大数和第K大数
代码:#include "stdio.h"#include "stdlib.h"//初始化最大值为a[0],次大值为a[1],遍历一次,每次比较并更新最大值和次大值,最后就可以得到次大值。int findsecondmaxvalue(int *a,int size){ int i,max,s_max; max=a[0]; //最大值 s_max=a[1]; //原创 2015-01-28 21:16:10 · 735 阅读 · 0 评论 -
回溯法的分析及N皇后问题
1.递归法原创 2015-03-27 23:31:32 · 675 阅读 · 0 评论 -
Strassen矩阵乘法
Strassen矩阵乘法是通过递归实现的,它将一般情况下二阶矩阵乘法(可扩展到n阶,但Strassen矩阵乘法要求n是2的幂)所需的8次乘法降低为7次,将计算时间从O(nE3)降低为O(nE2.81)。矩阵C = AB,可写为C11 = A11B11 + A12B21C12 = A11B12 + A12B22C21 = A21B11 + A22B21C22 = A21B转载 2015-03-20 21:21:04 · 721 阅读 · 0 评论 -
高效率的取幂运算
用递归去求解,跟矩阵的幂运算是一回事。long ing Pow( long int x , unsigned int N ) { if(N==0){ return 1; //递归出口 } if(IsEven(N)){ //判断N是不是偶数 return Pow(x*x,N/2); } else{ return Pow(x,N-1)*x;//如果是奇原创 2015-03-27 11:54:03 · 946 阅读 · 0 评论 -
BFS_catch the cow
实质就是遍历所有可能的点(踩点),点入队,先入先出,形成一棵枝繁叶茂的树,谁先到达目的点,谁就胜利,输出此条路径累计的时间数。所以要记录每一次踩点的累计值step.另外,一定要注意的是,已入队的点千万不要重复入队,因为这毫无意义(会重复进行此点此前的操作)代码如下:解法一:#include #include #include #include #include #d转载 2015-03-29 00:27:54 · 462 阅读 · 0 评论 -
数字hash _ 熟练掌握数组当作链表来用的技能
通过这道题要熟练掌握把数组当作链表来用的技能,这和图的邻接表的数组实现及其应用基于同样的原理。本题题目链接Snowflake Snow Snowflakes每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的。输入多个雪花,判断是否有形状一致的雪花存在。简单的数字哈希,要注意的是每种雪花可以由多种数字组合表示。转载 2015-03-29 20:22:34 · 514 阅读 · 0 评论 -
DFS—poj2488
先上代码poj2488#include #include #include #include using namespace std;#define maxn 26struct Point{ int x, y;} way[maxn * maxn];bool map[maxn][maxn];int p, q;bool found;int dir[8][2]原创 2015-04-10 21:21:51 · 449 阅读 · 0 评论 -
拓扑排序POJ1094
题目:POJ1094大意:对于N个大写字母,给定它们的一些偏序关系,要求判断出经过多少个偏序关系之后可以确定它们的排序或者存在冲突(有环存在,如A利用拓扑排序即可解决这个问题,但由于题目要求的是经过多少个关系之后就可以确定答案,因此每读入一个关系,就要进行一次拓扑排序。如果某一次拓扑排序之后可以确定它们的唯一排序或者发现冲突存在,则后面的直接略过。如果读入所有关系之后依然无法确定唯转载 2015-04-01 10:48:37 · 563 阅读 · 0 评论 -
判断是否是子树 和 判断二叉树是否平衡
有两棵很大的二叉树:T1有上百万个结点,T2有上百个结点。写程序判断T2是否为T1的子树。思路:先在T1中找到T2的根结点,然后依次去匹配它们的左右子树即可。注意:T1中的结点可能包含多个与T2根结点的值相同的结点。因此, 在T1中查找T2的根结点时,如果找到与T2匹配的子树,则返回真值;否则,还要继续查找, 直到在T1中找到一棵匹配的子树或是T1中的结点都查找完毕。代码如下:原创 2015-01-27 23:54:58 · 1009 阅读 · 0 评论 -
图的邻接表的数组实现及其应用
一、基础对于有向图来说,我们把每条边的起始点(from)称为尾节点,终止点称为头结点。我们可以把每条边按如下定义:typedef struct{ int to; int w; int next;}Edge; Edge e[MAX]; //MAX为边的数量。e为结构体数组,用于存储边的信息int pre[MAX];原创 2015-02-04 10:06:54 · 859 阅读 · 0 评论 -
中国余数定理
维基百科:一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。《孙子算经》中首次提到了同余方程转载 2015-04-01 23:12:22 · 13021 阅读 · 2 评论 -
哈夫曼编码
我们设置一个结构数组 HuffNode 保存哈夫曼树中各结点的信息。根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有 2n-1 个结点,所以数组 HuffNode 的大小设置为 2n-1 。HuffNode 结构中有 weight, lchild, rchild 和 parent 域。其中,weight 域保存结点的权值, lchild 和 rchild 分别保存该结点的左、右孩子的结点在数组转载 2015-03-13 19:23:18 · 1079 阅读 · 0 评论 -
字符串匹配(暴匹、 Rabin-Karp、KMP)
http://chaoswork.com/blog/2011/06/14/kmp%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/(最主要的一篇)http://blog.csdn.net/v_july_v/article/details/7041827#t5http://blog.csdn.net/yutianzuijin/article/details/119原创 2015-01-18 11:05:31 · 1843 阅读 · 0 评论 -
活动选择问题的动归和贪心解法
1.动归解法网络上找的代码错误百出,经Debug,正确输出结果。代码如下:#include using namespace std; #define N 11void dynamic_activity_selector(int *s,int *f,int c[N+2][N+2],int trace[N+2][N+2]);void print(int i,int j,in原创 2015-03-10 23:17:45 · 947 阅读 · 0 评论 -
Floyd算法(所有点对最短路径)
Floyd算法(所有点对最短路径)就是每对可以联通的顶点之间总存在一个借助于其他顶点作为媒介而达到路径最短的最短路径值(这个值通过不断增添的媒介顶点而得到更新,也可能不更新——通过媒介的路径并不比其原路径更短),所有的值存储于邻接矩阵中。典型的动归思想。值得注意的是,Floyd算法本次的状态的获取只用到了上个阶段的状态,而没有用到其他阶段的状态,这就为压缩空间奠定了条件。Floyd原创 2015-03-25 22:05:07 · 2229 阅读 · 0 评论 -
Bellman-Ford算法—求解带负权边的最短路径
1.Dijkstra不能得到含有负权边图(这里就不是环路了)的单源最短路径Dijkstra由于是贪心的,每次都找一个距源点最近的点(dmin),然后将该距离定为这个点到源点的最短路径(d[i]比如上图:1—>2权值为5,1—>3权值为6,3—>2权值为-2,求1到2的最短路径时,Dijkstra就会贪心的选择权为5的1—>2,但实际上1—>3—>2才是最优的结果,这样Dijks原创 2015-03-25 19:19:07 · 3384 阅读 · 0 评论 -
0-1背包的二维实现及一维实现
参考资料:《算法设计与分析基础》P228-P230 http://blog.csdn.net/tjyyyangyi/article/details/7929665 http://www.cnblogs.com/SDJL/archive/2008/08/22/1274312.html第i个物品放了(且能放下),就是 vi + f(原创 2015-01-26 15:08:01 · 733 阅读 · 0 评论 -
有向无环图的动态规划实现
Dijkstra算法的本质是贪心技术,适用于所有的有环与无环图。有向无环图,简称DAG。如果一个图是无环的,可以考虑用动态规划。具体参见:http://www.cnblogs.com/lpshou/archive/2012/04/17/2453370.html 点击打开链接代码实现:#include#include#define x 9999#define max 9999转载 2015-01-27 16:39:43 · 740 阅读 · 0 评论 -
约瑟夫环
原文地址:http://blog.csdn.net/kangroger/article/details/39254619约瑟夫环问题:一圈共有N个人,开始报数,报到M的人自杀,然后重新开始报数,问最后自杀的人是谁?如图:内环表示人排列的环,外环表示自杀顺序;上面N=41,M=3。最普通办法就是模拟整个过程:建一个bool数组,true表示此人还活着,false表转载 2015-01-10 22:25:41 · 469 阅读 · 0 评论 -
&&的短路特性
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句.解:利用&&的短路特性:如a&&b即如果a为假,b则被短路(不运算)代码如下:int add_fun(intn) { int num=0; (n>0)&&(num=n+add_fun(n-1));原创 2014-12-23 21:44:13 · 895 阅读 · 0 评论 -
多项式相乘(链表实现)
直接上代码,一个晚上的成果/******************************************************************多项式乘法链表实现*******************************************************************************/#define LIST_OK 1#defi原创 2014-12-23 21:13:20 · 1907 阅读 · 2 评论 -
有向图的邻接表实现
图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List)。1. 邻接表的结点结构(1)表结点结构 ┌────┬───┐ │adjvex │next │ └────┴───┘ 邻接表中每个表结点均有两转载 2015-01-30 20:13:29 · 1546 阅读 · 0 评论 -
大数阶乘
由于计算机数据表示大小的限制,在进行大数运算的过程中极有可能会发生数据溢出的危险,避免溢出的通用方法就是在大数运算中用数组来表示计算结果。代码如下:/******************************************** */ /* 算法思想转载自网络 *//* 程序功能:大整数的阶乘转载 2015-01-10 20:43:07 · 416 阅读 · 0 评论 -
数字转美分美元C实现
题目:pointer on c P190 T15/****把数字串(实质是字符串)'src'转换为美元和美分的格式*********并存储于'dst'****************************************/#includevoid dollars(register char *dst, register char const *src){原创 2014-12-13 18:44:38 · 1193 阅读 · 0 评论 -
最优二叉查找树
1.算法讲解见《算法设计与分析基础》P223-P227;2.关于如何确定循环的值,见下图:可得到下表:很显然,d作为最外层循环,i为次外层,而j作为i的因变量存在。i=1~(n-d),相应的j= i+d 。k作为最内存循环,每次开始循环时,始终用temp存储此次循环的最小值,即3.代码如下:#include#include#define max原创 2015-01-07 23:36:55 · 656 阅读 · 0 评论 -
卡特兰数——动态规划思想
问题描述:卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。输入一个整数n,计算h(n)。其递归式如下:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2,h(0) = h(1) = 1) 该递推关系的解为:h(n)=C(2n,n)/(n+1) (n=1,2,3,...) 思路:直接根据递归转载 2015-01-27 11:24:12 · 1556 阅读 · 0 评论 -
字符串编辑距离与拼写错误检查
编辑距离是指两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。编辑操作包括删除、添加(插入)和替换三种方式。当然,次数越小越相似。编辑距离应用最多的地方就是基于贝叶斯定理的拼写检查中,贝叶斯公式:用户输入一个单词时,可能拼写正确,也可能拼写错误。如果把拼写正确的情况记做c(代表correct),拼写错误的情况记做w(代表wrong),那么"拼写检查"要做的事情就是:原创 2015-01-25 19:50:25 · 1456 阅读 · 0 评论 -
最大子数组和(DP和递归解法)与最大子矩阵和
1. 最大子数组和参考资料:http://blog.csdn.net/liufeng_king/article/details/8632430 http://blog.csdn.net/beiyeqingteng/article/details/7056687题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子原创 2015-03-19 15:43:36 · 990 阅读 · 0 评论 -
红黑树的删除
在树中被删除的结点并不一定是那个最初包含要删除的数据项的那个结点。从这个角度来讲,所谓删除,是指颜色被重置,而非关键字被删除。就像下图中要删除z,实际被删除的是y,因为 y 顶替了 z 的位置,并被重置成 z 的颜色,就像z并没有消失,只是换了个关键字变成 y 而存在。而 y 却彻底消失了,本来有y在能保持的红黑树的5个性质却可能被破坏,虽然 y 原来的位置被 y.right 也就是 x原创 2015-03-15 22:00:58 · 450 阅读 · 0 评论 -
Dijkstra算法(单源最短路径)
预备知识:邻接矩阵:表示图的一种方法,是一个二维数组。用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边)的数据,这个二维数组称为邻接矩阵。对于每条边(u , v),我们置A[u][v]=1;否则,置为0.如果边有一个权,我们可以置A[u][v]等于该权,而使用一个很大或者很小的权作为标记表示不存在的边。注意,无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不一定对称(一原创 2015-01-07 12:35:18 · 645 阅读 · 0 评论 -
桶排序和基数排序(熟练掌握代码中结构体的使用trick)
extern void quick_sort(int a[], int p, int q);/*桶的数目等于元素的数目,data数组的所有元素值均在[0,1)之间,所以进入桶的编号可由k = data[i] * n;来确定*/struct barrel { //每个桶的结构(每个桶最多10个元素) int node[10]; int count;};原创 2015-03-19 00:01:09 · 472 阅读 · 0 评论 -
动态规划总结(背包问题的深入理解)
有这样两道题:1. 有一段楼梯有n级台阶,规定每一步只能跨一级或两级,要登上第n级台阶有多少种不同的走法?f[i]=sum{ f [ i - c[j] ] }其中c[j]为题目明确告知的可能性选择(在这里可以认为c[0]=1,c[1]=2),用于内循环(如果规定每一步能跨)i - c[j] 就是状态,它转移到状态i有c[j] 数组元素个数个可能性。即i可由i - c[j] 转移而来原创 2015-01-29 12:59:44 · 1390 阅读 · 0 评论 -
B树的删除操作
把B树压缩成数组的结构, 二维的树是由 一维的数组 进化(拉伸)而来的,所以我们先还原成 一维数组 可以简化对删除操作的思考(如前趋值、后趋值的获取就是一维数组中的)。假设删除节点x中的关键字为k,则每次要做的就是先从x的子节点中寻找(即向下寻找)一个关键字来替换(覆盖) k ,然后再递归删除此子节点中的此关键字(就像删除x中的k一样)。寻找的原则如下:1)k 的前趋值(k前面的那一个值)原创 2015-03-13 19:25:16 · 2336 阅读 · 0 评论 -
Algorithm tutorials(动归) && minipaint
个人认为最好的一篇文章点击打开链接:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg国内有人翻译成了中文,翻译质量很高点击打开链接:http://www.hawstein.com/posts/dp-novice-to-advanced.html注:好像中高级的例子解析是错误的,未求证。关于这篇文原创 2015-01-27 21:05:07 · 708 阅读 · 0 评论 -
动态规划原理解析
一、贪心算法通过一系列步骤构造问题的解,每一步对目前构造的部分解作一个扩展(往前推进,直至子问题的规模为零),直到获得问题的完整解为止。这个技术的核心是,所做的每一步选择都必须满足可行、局部最优、不可取消原则。代表性算法有Dijkstra算法(当前最短路径),Prime算法(向前面构造的子树添加离树中顶点最近的顶点(邻接顶点))和Kruskal算法(贪婪的把最小权的边(顶点)纳入集合,保证不产原创 2015-01-13 21:19:32 · 757 阅读 · 0 评论