数据结构/基础算法
从此醉
痴情种子本天生故曰向来痴相见恨晚犹断肠是名从此醉
展开
-
算法笔记之 整数划分
例如:6 有如下11种划分则p(6)=116;5+1;4+2, 4+1+1;3+3, 3+2+1, 3+1+1+1;2+2+2, 2+2+1+1, 2+1+1+1+1;1+1+1+1+1+1;在正整数n所有划分中,将最大加数n1不大于m的划分个数记作q(n, m).我们可以建立如下递归关系:(1) q(n, 1) = 1, n>=1最大加原创 2013-03-05 16:33:57 · 1184 阅读 · 0 评论 -
递推求解专题练习(For Beginner) 折线分割平面 HDU 2050
递推求解练习原创 2013-07-07 10:21:30 · 1715 阅读 · 0 评论 -
鸽巢原理应用-分糖果 POJ 3370 Halloween treats
基本原理:n+1只鸽子飞回n个鸽笼至少有一个鸽笼含有不少于2只的鸽子。很简单,应用却也很多,很巧妙,看例题:DescriptionEvery year there is the same problem at Halloween: Each neighbour is only willing to give a certain total number of sweets on原创 2013-07-08 09:22:13 · 1666 阅读 · 0 评论 -
单调队列-首尾相连数组的最大子数组和
题目描述:给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的。数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr[n-1],arr[0],…,arr[j],现在请你这个ACM_Lover用一个最高效的方法帮忙找出所有连续子数组和的最大值(如果数组中的元素全部为负数,则最大和为0,即一个也没有选)。转载 2013-07-26 16:51:43 · 1038 阅读 · 0 评论 -
二分法-网易有道2013年校园招聘面试一面试题
九度:http://ac.jobdu.com/problem.php?pid=1502题目描述:在印刷术发明之前,复制一本书是一个很困难的工作,工作量很大,而且需要大家的积极配合来抄写一本书,团队合作能力很重要。当时都是通过招募抄写员来进行书本的录入和复制工作的, 假设现在要抄写m本书,编号为1,2,3...m, 每本书有1输入:输入可能包含多个测试样例。转载 2013-08-13 09:31:20 · 1651 阅读 · 0 评论 -
数据结构基础练习-二叉树的镜像
题目描述:输入一个二叉树,输出其镜像。输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为一个整数n(0Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。Ci=’原创 2013-08-10 20:36:14 · 1153 阅读 · 0 评论 -
关于括号匹配的一些问题总结
1 九度OJ 1153使用栈简单的匹配http://ac.jobdu.com/problem.php?pid=1153#include #include #include using namespace std; int main(){ char str[100]; char out[100]; stack s; while(sc原创 2013-08-25 18:06:07 · 931 阅读 · 0 评论 -
使用hash表加速寻找-POJ 3349
DescriptionYou may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Your program will read information about a collection of s原创 2013-08-14 15:30:53 · 998 阅读 · 0 评论 -
九度 1044:Pre-Post 递归求n叉树结构个数
题目描述: We are all familiar with pre-order, in-order and post-order traversals of binary trees. A common problem in data structure classes is to find the pre-order traversal of a binary tree原创 2013-08-15 15:24:20 · 1073 阅读 · 0 评论 -
进制转换练习题两道
题目均来自九度,北大的研究生机试题题目1118:数制转换题目描述: 求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。 不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。输入: 输入只有一行,包含三个整数a,n,b。a表示其原创 2013-08-16 22:34:40 · 2358 阅读 · 0 评论 -
矩阵连乘 动态规划求解
#includeusing namespace std;const int MAX = 100;int m[MAX][MAX], s[MAX][MAX];int n;int opt[MAX][MAX], path[MAX][MAX];int p[MAX];void matrixChain() { for (int i = 1; i <= n; i++) m[i][i] = 0原创 2013-04-29 21:49:21 · 1012 阅读 · 0 评论 -
分治算法之 棋盘覆盖问题(完整代码实现)
我在这里是用了一个简化的方式,只是代码简化,还是分治递归思想。一分为4,直至2*2时可直接解决。四种骨牌的摆放刚好对应:dir[4][2] = { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 1, 0 } }; 这四个方向。而这4个方向,又可用来判断残缺位置的 4个方向(左上,右上,右下,左下)。因此可以用循环,而不是依次判断四个方向,简化代码。也可以用一个全局原创 2013-03-23 20:04:31 · 5568 阅读 · 0 评论 -
康托展开式
康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。以下称第x个全排列是都是指由小到大的顺序。公式[编辑]X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!其中,a[i]为整数,并且0a[i]的意义参见举原创 2013-10-16 18:54:38 · 987 阅读 · 0 评论 -
贪心算法求解 图的m着色问题
图的m色判定问题: 给定无向连通图G和m种颜色。用这些颜色为图G的各顶点着色.问是否存在着色方法,使得G中任2邻接点有不同颜色。图的m色优化问题:给定无向连通图G,为图G的各顶点着色, 使图中任2邻接点着不同颜色,问最少需要几种颜色。所需的最少颜色的数目m称为该图的色数。若图G是可平面图,则它的色数不超过4色(4色定理). 4色定理的应用:在一个平面或球面上的任何地图能够只用4种原创 2013-03-29 19:45:51 · 7484 阅读 · 2 评论 -
扩展KMP算法实现
对于字符串S和T,n=|S|,m=|T|。要求S(i,n)与T的最长公共前缀长度(i=1,2...n)。 用B[i]表示该长度,那么S(i,n)与T的最长公共前缀即S(i,i+B[i]-1)。 暴力枚举所用时间为O(nm),慢的原因是计算了很多冗余情况。如: S = AAAAAAAAB, T = AAAAAAAAC 那么,第一次比较了9位。原创 2013-10-24 11:46:08 · 1057 阅读 · 0 评论 -
递推练习1 HDU 2047
Problem Description今年的ACM暑期集训队一共有18人,分为6支队伍。其中有一个叫做EOF的队伍,由04级的阿牛、XC以及05级的COY组成。在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一块上等的牛肉干,准备在上面刻下一个长度为n的只由"E" "O" "F"三种字符组成的字符串(可以只有其中一种或两种字符,原创 2013-07-06 21:44:41 · 1410 阅读 · 0 评论 -
Poj 1002 字典树
DescriptionBusinesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phrase. For example, you can call the Universit原创 2013-04-23 08:32:49 · 1042 阅读 · 0 评论 -
算法笔记 之 快速排序的几种写法
这是基本都一样的部分。void print_arr(int *arr, int n) { int i; for (i = 0; i < n; i++) { if (!i) { printf("%d", arr[i]); } else { printf(" %d", arr[i]); } } printf("\n");}void sort(int *原创 2013-03-06 12:58:15 · 3051 阅读 · 2 评论 -
算法笔记之 全排列算法 一 递归求解
集合R={1,2,3,4}的全排列可以分解为:1,{2,3,4}的全排列 + 2,{1,3,4}的全排列 + 3,{1,2,4}的全排列 + 4,{1,2,3}的全排列。继续分解:{2,3,4} 为 2,{3,4}的全排列,3,{2,4}, 4,{2,3}…………………………………………直到集合里只有一个元素,就可直接输出了.这个是非递归的方法:http://blog原创 2013-03-05 06:29:18 · 22419 阅读 · 13 评论 -
矩阵的快速幂及应用
以二阶矩阵为例。典型的斐波那契数列,就可以使用矩阵相乘来求解。如果不考虑乘法的话,复杂度应该是lgn.下面只给出计算矩阵快速幂的方法#include #define L 10000using namespace std;class MyMatrix{public: long long a00,a01,a10,a11; MyMatrix(); MyMatrix(long原创 2013-03-31 21:24:58 · 1176 阅读 · 0 评论 -
Dijkstra算法
//============================================================================// Name : Dijkstra.cpp// Author : // Version :// Copyright : Your copyright notice// Description :原创 2013-04-08 10:36:15 · 829 阅读 · 0 评论 -
HOJ 小明系列故事——师兄帮帮忙
Problem Description 小明自从告别了ACM/ICPC之后,就开始潜心研究数学问题了,一则可以为接下来的考研做准备,再者可以借此机会帮助一些同学,尤其是漂亮的师妹。这不,班里唯一的女生又拿一道数学题来请教小明,小明当然很高兴的就接受了。不过等他仔细读题以后,发现自己也不会做,这下小明囧了:如果回复说自己不懂,岂不是很没面子? 所以,他现在私下求你帮忙解决这道题目,题原创 2013-03-25 22:44:21 · 1111 阅读 · 0 评论 -
快速幂取模
#include #include #include using namespace std;//计算 m^n % k, 快速幂取模long getMi(long m,long n,long k){ long t = 1; int tmp = m; while(n){ if( n & 1) t = t * tmp % k; tmp = tmp * tmp % k; n原创 2013-03-25 21:44:34 · 951 阅读 · 0 评论 -
使用筛法找素数 HOJ 2098 分拆素数和
Problem Description把一个偶数拆成两个不同素数的和,有几种拆法呢? Input输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。 Output对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。 Sample Input30260原创 2013-04-11 15:10:22 · 1355 阅读 · 0 评论 -
C++ ACM 基础 cin重定向 cout 格式化输出
#include #include #include #include using namespace std;int n;int main() { //用 stdin 可以写相对路径 //freopen("in.txt","r",stdin); //cin 重定向一定要写绝对地址 ifstream cin("D:\\C++\\work_algo\\进制转换C++\\in.原创 2013-04-23 11:17:13 · 3570 阅读 · 0 评论 -
字典树 基础模版
MAX 为自定义的。根据实际情况。这是只要考虑小写字母 a-z#include #include using namespace std;#define MAX 26typedef struct TrieNode{ int nCount; // 该节点前缀 出现的次数 struct TrieNode *next[MAX]; //该节点的后续节点} Tri原创 2013-04-23 16:34:06 · 930 阅读 · 0 评论 -
回溯法 解 n皇后问题
#include using namespace std;int x[20]; //解向量int sum; //可行方案个数int n;//在第t列是否可放置bool place(int t){ int i; for(i=1; i<t; i++) //如果 行-行 == 列-列 或者 在同一列。 if(abs(t-i) == abs(x[t]-x[i]) || x[i原创 2013-04-19 15:35:38 · 926 阅读 · 0 评论 -
算法笔记之 全排列的 非递归求解
这个也是比较常见的方法。先交换,再把后面的数组逆置就行了递归的方法点下面:算法笔记之 全排列算法 一 递归求解完整的Java代码:public class 全排列 { private static void swap(int[] array, int i, int j) { int tmp = array[i]; arra原创 2013-03-07 14:03:11 · 2815 阅读 · 5 评论 -
堆排序 C++
#include using namespace std;void AdjustHeap(int A[], int hlen, int i){ int left = 2*(i+1)-1; int right = 2*(i+1); int largest = i; int temp; while(left < hlen || right < hlen){ if(left < hl原创 2013-05-02 20:36:26 · 838 阅读 · 0 评论 -
题目1090:路径打印。N叉树
题目描述:给你一串路径,譬如:a\b\ca\d\eb\cstd\你把这些路径中蕴含的目录结构给画出来,子目录直接列在父目录下面,并比父目录向右缩一格,就像这样:a b c d eb cstd同一级的需要按字母顺序排列,不能乱。输入: 每个测试案例第一行为一个正整数n(n输出:原创 2013-04-08 14:54:43 · 1672 阅读 · 0 评论 -
哈夫曼树结合堆排序 POJ(3253)
DescriptionFarmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer len原创 2013-04-25 14:57:50 · 2087 阅读 · 0 评论 -
Kmp算法的两种写法
两种写法的基本思想是一直的。只是求next数组的方式不同,next数组所得的值也有所不同。原理不多说,网上讲的很多,这里只贴出完整的实现代码。一般网上讲解的求next数组的都是针对方法二的。第一种优化写法。const int N = 100;int next[N];int pattern_len, str_len;char pattern[N];char str原创 2013-10-22 16:25:54 · 1448 阅读 · 0 评论