
ACM
MilkyTea'Ou
这个作者很懒,什么都没留下…
展开
-
【递归】汉诺塔
问题描述:与梵塔问题相同,设ABC是3个塔座,初始时塔座A上有四个圆盘,各圆盘从小到大编号为:1、2、3、4,奇数号圆盘为红色,偶数号圆盘为蓝色。现要求将塔座A上的圆盘移到塔座C上,除满足梵塔问题的移动规则外,还必须满足:任何时刻不允许将同色圆盘叠在一起。试设计一个算法,以最少次数完成上述移动,并输出每次移动的圆盘编号、起始塔座、目的塔座。并对自己的程序进行复杂性分析。#include#incl原创 2012-11-28 12:49:11 · 830 阅读 · 0 评论 -
HDOJ 1782 (深搜和广搜)
初开始用深搜提交后超时,代码如下:#include#include#includeusing namespace std;char mass[110][110]; //1728int move[4][2]={{-1,0},{1,0},{0,-1},{0,1}};int k, x1, y1, x2, y2原创 2012-09-21 20:32:44 · 1674 阅读 · 0 评论 -
广度搜索算法实例
分油问题一个一斤的瓶子装满油,另有一个七两和一个三两的空瓶,再没有其它工具。只用这三个瓶子怎样精确地把一斤油分成两个半斤油。选择广度优先算法来求解分油问题可以得到通过最少步骤完成分油的最优解。1)定义状态结点分油过程实际上就是将油从一个油瓶倒入另一个油瓶。分油过程中,各个油瓶中的油在不断变化,因此需要记录各个油瓶在不同状态所装油的多少。这里用一个数组bottle[3]存放当前油瓶中转载 2012-09-15 12:31:31 · 1193 阅读 · 0 评论 -
搜索算法之回溯讲解
特点:回溯法有通用的解题法之称。用它可以系统的搜索一个问题的所以解或任一解。回溯法是一个既带有系统性又带有跳跃性的搜索算法。它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间。算法搜索至解空间树的任一结点时,先判断该节点是否包含问题的解。如果肯定不包含,则跳过对以该节点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先策略搜索。回溯法求问题的所有解时,要回溯到跟,且原创 2012-09-15 10:10:47 · 3240 阅读 · 0 评论 -
HDOJ —2009 翻纸牌游戏——搜索(回溯)算法
HDOJ —2009 翻纸牌游戏Problem Description有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌。但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,原创 2012-09-14 22:06:18 · 1258 阅读 · 0 评论 -
分治法——二分搜索
二分搜索技术是运用分治策略的典型例子。对于已排好序的n个元素,现在要在这n个元素中找出一特定元素x。template int BinarySearch(Type a[],const Type&x,int n){int left=0;int right=n-1;while(keft{int middle=(left+right)/2;if(x==a[middl原创 2012-09-05 18:07:37 · 1049 阅读 · 0 评论 -
杭电OJ 1028
学了DP大家都知道这题使用动态规划做的,但是提交时竟出现超时现象,为什么呢?参考过一位同学的答案可知,原来这道题中还学要对每个结果的值进行记忆。 #include#includeint main(){ int n,i,j,k; __int64 f[130][130]; memset(f,0,sizeof(f)); f原创 2012-08-28 14:16:31 · 1097 阅读 · 0 评论 -
括号匹配
dp[i][j](j >= i)表示使从第i个字符到第j个字符匹配所需添加的最小括号数(有点绕口,但应该不难明白吧),那么这一状态可由下面得到:若第i个字符到第j - 1个字符中没有与第j个字符匹配的括号,则所需的括号数加1,即f[i][j] = f[i][j - 1] + 1;若第k(k 代码如下:[cpp] view plaincopyprint?转载 2012-08-21 15:17:07 · 485 阅读 · 0 评论 -
算法小计
关于大数内部排序的问题:即一个整数,按照每一位的数字大小重新输出一个整数,例如7634,输出3467.解决方法:不需进行排序,记录下1至9数字的次数然后打印。一个未知长度的数组,不需要便利整个数组,便可求的中间的元素的下标:定义两个指针,一个指针每次跳两步,另一个指针每次跳一步而且最好指向的便是中间的数组转载 2012-08-17 14:13:41 · 562 阅读 · 0 评论 -
数论——有理数和无理数
两个整数相除,结果一定是有理数。无理数即无限不循环小数无法转化成分数形式。无理数的类型:1.开方开不尽(如根号2)2.与π有关(如π+2)3.有规律但不循环(如0.1010010001。。。。。。)如何把无限循环小数转化成分数:其实,循环小数化分数难就难在无限的小数位数。所以我就从这里入手,想办法“剪掉”无限循环小数的“大尾巴”。策略就是用扩倍的方法,把无限原创 2012-10-21 16:02:51 · 1952 阅读 · 0 评论 -
字典树 hdu 1075
1.字典树在串的快速检索中的应用。给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。2. 字典树在“串”排序方面的应用给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出用字典原创 2012-10-17 15:24:47 · 866 阅读 · 0 评论 -
AC自动机
举例:给定5个单词:say she shr he her,然后给定一个字符串yasherhs。问一共有多少单词在这个字符串中出现过。怎样解决这样的问题,如果只知道字典树,至少还有些头绪,可是要解决这个问题,还需对字典树做相应的改变。多模匹配算法 :多模式匹配在这里指的是在一个字符串中寻找多个模式字符字串的问题。一般来说,给出一个长字符串和很多短模式字符串,如何最快最省的原创 2012-10-30 16:29:20 · 573 阅读 · 0 评论 -
【数论】HDOJ 2802
题目: 输入任意 n (1AC code (1):#include using namespace std;#define M 4019int f[M];int main(){ long i,n; f[1]=1;f[2]=7;f[3]=20; for(i=4;i<M;i++) { f[i]=f[i-2]+3*i*(i原创 2013-02-20 21:46:05 · 1042 阅读 · 2 评论 -
【数论】NYOJ 330
题目 : 求 1/n 是循环小数的,只输出第一个循环节 AC code: #includechar vec[1000100];int main(){ int temp,start,n,T,t,c2,c5,j,top; scanf("%d",&T); int num; while(T--) { j=top=num原创 2013-02-20 16:45:06 · 739 阅读 · 0 评论 -
【数论】HDOJ 1013
题目大意:一个正整数,如果各位上的数字之和为一位数,则这个一位数便是这个正整数的数字根,如果和为两位或者是多为数,则继续求各位数字的和,知道求得数字根为止。第一次求解出现WR 原因发现是超出范围,第二次改成string 类型 发现超时,我晕,第三回看见讨论区中的代码,发现高手真实太多了。但随之产生一问题,(先求各位的总和,然后判断处理) (逐次加上下一位的数字,然后判断处理原创 2012-11-22 16:21:01 · 590 阅读 · 0 评论 -
hdu 1247 字典树 Hat’s Words
这个代码不知道为什么AC不了#include #include#includestruct trie{ int ch; trie *next[26]; trie() { ch=0; for(int i=0;i<26;i++) next[i]=NULL; }};trie *root;char str[50010][100];void insert(ch原创 2012-12-01 17:05:29 · 614 阅读 · 0 评论 -
线段树 poj 2352
再次遇到线段树的题型,这次一定不能放过它,不能让它成为我AC的绊脚石。POJ 2352 http://poj.org/problem?id=2352大致题意:坐标上有一些点,把同时不大于某点的横坐标和纵坐标的点的个数做为该点的权值,求权值为0,1,2,。。。n-1 的点的个数。解题思路:定义一个树状数组:tree[maxn*4],在此树结构中每个结点保存落在一段数值范围上的原创 2012-11-20 17:15:51 · 674 阅读 · 0 评论 -
HDOJ 1222
原文出处:http://www.cppblog.com/wyh123/archive/2011/07/29/152058.html题目大意:有一只狼和一只兔子,兔子只能躲在n个洞(编号0~n-1)中的任意一个洞里,狼则每跑m个洞会进洞看看兔子有没有在里面。 现在给出一个n,m求兔子是否安全。 例如当n=6,m=2时,狼只能够进去0,2转载 2012-10-21 16:45:46 · 596 阅读 · 0 评论 -
HDOJ 1007 (分治法)
/** 用分治法求最近点对问题,时间复杂度为O(n*logn*logn) */ /** 最近点对问题,时间复杂度为O(n*logn*logn) */ #include #include #include #include #include using namespace std; const double INF = 1e20; //1e20原创 2012-10-15 17:51:22 · 1108 阅读 · 0 评论 -
后缀表达式
常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表达示。逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+cd+*正常的表达式 逆波兰表达式 a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)*d -原创 2012-10-05 10:42:55 · 756 阅读 · 0 评论 -
矩阵乘法
计算两个矩阵乘积的标准算法如下:其中,ra,ca和rb,cb分别表示矩阵A和B的行数和列数void martriMultiply(int **a,int **b,int **c,int ra,int ca,int rb,int cb){if(ca!=rb) error("矩阵不可乘");for(int i=0;ifor(int j=0;j{int sum=a[i原创 2012-08-21 15:50:29 · 1198 阅读 · 0 评论