随笔分类 -  算法学习

摘要:#include <iostream>using namespace std;#define SWAP(i,j) {int t=(i);(i)=(j);(j)=t;}//插入排序void InsertSort(int*a,int len){ for (int i=1;i<len;i++) { int j=i,x=a[i]; while (j && a[j-1]>x)a[j]=a[j-1],j--; a[j]=x; }}//选择排序void SelectSort(int*a,int len){ for (int i=1,j,k;i... 阅读全文
posted @ 2010-10-19 11:03 BuildNewApp 阅读(273) 评论(0) 推荐(0)
摘要:Floyd-Warshall算法,简称Floyd算法,用于求解任意两点间的最短距离,时间复杂度为O(n^3)。我们平时所见的Floyd算法的一般形式如下:1voidFloyd(){2inti,j,k;3for(k=1;k<=n;k++)4for(i=1;i<=n;i++)5for(j=1;j<=n;j++)6if(dist[i][k]+dist[k][j]<dist[i][j])7dist[i][j]=dist[i][k]+dist[k][j];8} 注意下第6行这个地方,如果dist[i][k]或者dist[k][j]不存在,程序中用一个很大的数代替。最好写成if(d 阅读全文
posted @ 2010-09-26 08:48 BuildNewApp 阅读(636) 评论(0) 推荐(0)
摘要:Trie树就是字典树,其核心思想就是空间换时间。举个简单的例子。 给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,第一次出现第几个位置。 这题当然可以用hash来,但是我要介绍的是trie树。在某些方面它的用途更大。比如说对于某一个单词,我要询问它的前缀是否出现过。这样hash就不好搞了,而用trie还是很简单。 现在回到例子中,如果我们用最傻的方法,对于每一个单词,我们都要去查找它前面的单词中是否有它。那么这个算法的复杂度就是O(n^2)。显然对于100000的范围难以接受。现在我们换个思路想。假设我要查询的单词是abcd,那么在他前面的单词中,以 阅读全文
posted @ 2010-09-25 20:33 BuildNewApp 阅读(264) 评论(0) 推荐(1)
摘要:【引言】 在解题过程中,我们有时需要维护一个数组的前缀和S[i]=A[1]+A[2]+...+A[i]。 但是不难发现,如果我们修改了任意一个A[i],S[i]、S[i+1]...S[n]都会发生变化。 可以说,每次修改A[i]后,调整前缀和S[]在最坏情况下会需要O(n)的时间。 当n非常大时,程序会运行得非常缓慢。 因此,这里我们引入“树状数组”,它的修改与求和都是O(logn)的,效率非常高。【理论】 为了对树状数组有个形 象的认识,我们先看下面这张图。 如图所示,红色矩形表示的数组C[]就是树状数组。 这里,C[i]表示A[i-2^k+1]到A[i]的和,而k则是i在二进制时末尾0的. 阅读全文
posted @ 2010-09-24 11:09 BuildNewApp 阅读(173) 评论(0) 推荐(1)
摘要:关于什么是母函数 , 以及在现实生活中的应用 , 请大家详看 或者 HDU 母函数 PPT:http://www.cppblog.com/MiYu/archive/2010/08/05/122290.html对于给出的母函数模板 , 让人理解起来比较费劲的!以下给出几种解释 , 和自己理解!//made by syx //time 2010年9月11日 10:17:27 //母函数例题/*//整数拆分模板 #include <iostream> using namespace std; const int lmax=10000;//c1是用来存放展开式的系数的,而c2则是用来计算时 阅读全文
posted @ 2010-09-19 11:15 BuildNewApp 阅读(790) 评论(0) 推荐(0)
摘要:Felix大牛给了一种更简单使用文件输入输出的改进方法,在ACM中应用很广,而且超赞,现在来介绍一下。这次用到的文件打开函数不再是fopen,而是stdio.h中包含的另一个函数freopenFILE * freopen ( const char * filename, const char * mode, FILE * stream );【参数说明】filename: 要打开的文件名mode: 文件打开的模式,和fopen中的模式(r/w)相同stream: 文件指针,通常使用标准流文件(stdin/stdout/stderr)【使用方法】因为文件指针使用的是标准流文件,因此我们可以不定义文 阅读全文
posted @ 2010-09-18 21:28 BuildNewApp 阅读(1724) 评论(0) 推荐(1)
摘要:目录原型 char *strtok(char *s, char *delim);功能 分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。说明 首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。 strtok在s中查找包含在delim中的字符并用NULL('')来替换,直到找遍整个字符串。 char * p = strtok(s,";"); p = strtok(null,";"); 在调用的过程中,字串s被改变了,这点是要注意的。返回值 从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。 阅读全文
posted @ 2010-09-02 14:26 BuildNewApp 阅读(420) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2094题目描述:01 /*02 一道很明显的数据结构题, 用拓扑排序解决.03 当 输入 A 战胜 B 时, 让 B 指向 A, 表示B曾被打败过.04 最后指向空的就表示没有人战胜过他, 如果这样的人仅05 存在一个,那么明显,最后的冠军就是他了. 这里我用到了06 C++ STL 的map set 用来实现 B->A 的映射关系.07 */08 09 //HDOJ HDU 2094 产生冠军 ACM 2094 IN HDU10 #include <iostream>11 #in 阅读全文
posted @ 2010-09-02 08:59 BuildNewApp 阅读(315) 评论(0) 推荐(0)
摘要:原题:http://acm.hdu.edu.cn/showproblem.php?pid=2066本人写的 至今还不知道为什么 WA 0rz!//HDU 2066 #include <iostream> using namespace std;const int MAX = 1002; const int INF = 0x7FFFFFF;//4字节int最大值 int g[MAX+1][MAX+1];//存储图 int hash[MAX+1];//存储是否访问 int path[MAX+1];//存储从源到i的最短路径,及特殊路径 int T , S , D , L; int s[ 阅读全文
posted @ 2010-09-01 20:09 BuildNewApp 阅读(377) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1548题目描述:题目下!//算法分析 最短路//Made by syx//Time 2010年9月1日 09:25:35/*Dijkstra算法的基本思路是:假设每个点都有一对标号 (dj, pj),其中dj是从起源点s到点j的最短路径的长度 (从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);pj则是从s到j的最短路径中j点的前一点。求解从起源点s到点j的最短路径算法的基本过程如下: 1) 初始化。起源点设置为:① ds=0, ps为空;② 所有其他点: di=∞, pi=?;③ 标. 阅读全文
posted @ 2010-09-01 14:08 BuildNewApp 阅读(552) 评论(0) 推荐(1)
摘要:MiYu原创, 转帖请注明 : 转载自 ______________白白の屋题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1715题目描述:Problem DescriptionFibonacci数列,定义如下:f(1)=f(2)=1f(n)=f(n-1)+f(n-2) n>=3。计算第n项Fibonacci数值。Input输入第一行为一个整数N,接下来N行为整数Pi(1<=Pi<=1000)。Output输出为N行,每行为对应的f(Pi)。Sample Input512345Sample Output11235看题目就知道是大 阅读全文
posted @ 2010-08-25 09:59 BuildNewApp 阅读(261) 评论(0) 推荐(0)
摘要:银河英雄传说【问题描述】 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 30000。之后,他把自己的战舰也依次编号为1, 2, …, 30000,让第i号战舰处于第i列(i = 1, 2, …, 30... 阅读全文
posted @ 2010-08-19 10:43 BuildNewApp 阅读(395) 评论(0) 推荐(0)
摘要:并查集 (Union-Find Sets)并查集:(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多。一般采取树形结构来存储并查集,并利用一个rank数组来存储集合的深度下界,在查找操作时进行路径压缩使后续的查找操作加速。这样优化实现的并查集,空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(M Alpha(N)),这里Alpha是Ackerman函数的某个反函数,在很大的范围内(人类目前观测到的宇宙范围估算有10的80次方个原子,这小于前面所说的范围)这个函数的 阅读全文
posted @ 2010-08-19 10:42 BuildNewApp 阅读(362) 评论(0) 推荐(0)
摘要://Made by syx //Time 2010年8月17日 10:11:04 //贪心算法//贪心算法的基本步骤 //1、从问题的某个初始解出发。 //2、采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略, // 得到一个部分解,缩小问题的范围或规模。 //3、将所有部分解综合起来,得到问题的最终解。题目:http://acm.hdu.edu.cn/problemclass.php?id=29//1050 Moving Tables //1 如果没有交叉,则总时间为 1 * 10 //如果有交叉一层,则总时间为 2 * 10//如果交叉n层,则总时间为 (n + 1)* 10. 阅读全文
posted @ 2010-08-18 09:20 BuildNewApp 阅读(431) 评论(0) 推荐(0)
摘要://Made by syx //Time 2010年8月15日 10:13:12 // //小结:DP的基本思想 如果各个子问题不是独立的,不同的子问题的个数只是多项式量级, 如果我们能够保存已经解决的子问题的答案,而在需要的时候再找 出已求得的答案,这样就可以避免大量的重复计算。 由此而来的基本思路是——用一个表记录所有已解决的子 问题的答案,不管该问题以后是否被用到,只要它被计算过,就将 其结果填入表中。 /*//1421 搬寝室#include <stdio.h> #include <stdlib.h> #define size 2005 #define INIT 阅读全文
posted @ 2010-08-16 21:32 BuildNewApp 阅读(2350) 评论(0) 推荐(1)
摘要://Made by syx //Time 2010年8月15日 09:01:57 //1465 不容易系列之一 // //总结:递推求解的基本方法:首先,确认:能否容易的得到简单情况的解? 然后,假设:规模为N-1的情况已经得到解决。最后,重点分析:当规模扩大到N时,如何枚举出所有的情况,并且要确保对于每一种子情况都能用已经得到的数据解决。强调: 1、编程中的空间换时间的思想 2、并不一定只是从N-1到N的分析//1465 不容易系列之一//基本形式:d[1]=0; d[2]=1 //递归式:d[n]= (n-1)*( d[n-1] + d[n-2]) //这就是著名的错排公式1、当N=1和. 阅读全文
posted @ 2010-08-15 09:58 BuildNewApp 阅读(467) 评论(0) 推荐(0)
摘要://Made by syx //Time : 2010年8月14日 16:20:34 // ////1071 The area//可令抛物线表达式为y= a(x-x1)^2+y1; //直线表达式为y=kx+b; //面积可通过微积分来计算a(x-x1)^2+y1 -(kx+b)在x2到x3区间内的定积分的值则为面积结果。#include <stdio.h>int main(){int n;scanf("%d",&n);while(n--){ double x0,y0,x1,y1,x2,y2,area=0; scanf("%lf %lf %lf 阅读全文
posted @ 2010-08-14 16:32 BuildNewApp 阅读(221) 评论(0) 推荐(0)
摘要:qsort函数声明如下:void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));参数说明如下: base: 要排序的数组 nmemb: 数组中的元素数目 size: 每个数组元素占用内存空间,可使用sizeof获得 compar: 比较两个数组元素的比较函数。本比较函数的第一个参数值小于、等于、大于第二参数值时,本比较函数的返回值应分别小于、等于、大于零。也就说你要实现一个这样的函数:int cmp(const void *a, const void *b) 如果a 阅读全文
posted @ 2010-07-30 22:42 BuildNewApp 阅读(699) 评论(0) 推荐(0)
摘要:简介 函数名: bsearch 功 能: 二分法搜索 用 法: void *bsearch(const void *key, const void *base, size_t *nelem, size_t width, int(*fcmp)(const void *, const *)); 语法: #include <stdlib.h> void *bsearch( const void *key, const void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) ); 功能: 阅读全文
posted @ 2010-07-30 22:33 BuildNewApp 阅读(382) 评论(0) 推荐(0)
摘要://Made by syx //Time 2010年7月29日 09:55:28 // //2020 绝对值排序 //2021 发工资咯:) //2024 C语言合法标识符 //2028 Lowest Common Multiple Plus //2029 Palindromes_easy version 回文串 //2030 汉字统计/*//2030 汉字统计 #include <iostream> #include <string> using namespace std; int main() { string s; int n,i,count; cin>& 阅读全文
posted @ 2010-07-30 10:49 BuildNewApp 阅读(616) 评论(0) 推荐(0)