2013年11月6日

凸包算法的初步学习

摘要: 所谓凸包问题是指给定一系列的点,求解出这些点中组合起来的能把所有其他点包裹起来的最小多边形。预备知识是向量的点乘和方向判定。方法是,首先找出纵坐标最小的点,若有相同最小纵坐标再取横坐标最小,如果有相同的点可以删掉一个;之后以选定的点为基准,按照每点与基准点的角度大小进行扫描,扫描规以上图为例,首先以A为基准点,首先插入B,可知B一定在凸包上,接下来扫描C...当扫描到G时,向量,和向量的点乘为正(逆时针扫描时判断是否为负,顺时针相反),则删掉H,回溯删掉所有符号不相同的点。扫描完一遍后,即可得到凸包。其算法空间复杂度为O(1)。代码如下:#include #include #include u 阅读全文

posted @ 2013-11-06 20:20 金仁赫 阅读(291) 评论(0) 推荐(0)

2013年8月31日

kmp算法初步了解

摘要: 最近一直在看kmp算法来解决字符串匹配的超时问题,看了好多材料终于有一点顿悟了。其实kmp算法难就难在对于next[]数组的理解方面,有很多人不理解不匹配的字符对应的模式函数值next[i]的值是怎么得来的,总结起来解释就是找出不匹配字符前面与开头字符的最大匹配数字。例如在求解模式串T:ababc时其第五个字符前面两个字符与开头两个字符一致,故next[4]=2.除此之外对于其他几种情况有以下总结:(1)next[0]= -1意义:任何串的第一个字符的模式值规定为-1。(2)next[j]= -1 意义:模式串T中下标为j的字符,如果与首字符相同,且j的前面的1—k个字符与开头的1—k个字符不 阅读全文

posted @ 2013-08-31 20:31 金仁赫 阅读(199) 评论(0) 推荐(0)

2013年8月14日

优化

摘要: 最近对于一些动态规划问题有了初步的了解,但是在做题时面临着一系列优化问题,比如最小回文串添加数问题,如果搞不好会出现Memory LimitExceeded(内存超出,即在出结果之前调用的内存超出了限制)。对于这类问题要回到Dp的本质问题方面进行考虑。Dp的目的是对一个问题进行分解之后对其子问题进行处理的算法,而处理的时候遵循枚举法(听课之前认为是递推)把所有的情况枚举出来然后存储在一个数组里方便调用。而一般的Dp调用的只是与当前数据有关的前几个数据,一般是两个,比如01背包问题、最长公共子序列、求局部最大和问题等等,不过问题是当处理数据过大时,可能定义的数组维数会影响到数据的计算,也就是内存 阅读全文

posted @ 2013-08-14 13:51 金仁赫 阅读(265) 评论(0) 推荐(0)

2013年8月11日

Robot Motion

摘要: 题目大意是:有一个机器人按照一定的程序进行移动,当遇到“S”时,机器人向下移动一位,“N”向上移动一位,“W”向左移动一位,“E”向右移动一位。给定一个区域,长len1,宽为len2,用一个二维字符串数组表示机器人所在的区域,起始机器人在第一行的loc位置,求解机器人走出这个区域的步数m,或者在区域内形成一个圈时,即当机器人走不出这片区域时,求解出踏入循环前的步数x和循环的步数y。输入:输入三个整型数,len1,len2,loc分别代表区域的长、宽和机器人所在的位置(注意位置是从一开始计算的),当len1,len2,loc都为0时结束输入。输出:当能走出区域时输出m step(s) to ex 阅读全文

posted @ 2013-08-11 17:26 金仁赫 阅读(361) 评论(0) 推荐(0)

2013年8月5日

从“信件装错”问题向递推问题的延伸

摘要: 对于含有一定递推规律的实际问题,往往是找到递推公式,而对于给出的题目,sample往往是几个简单的可以计算出来的值,对于sample的分析是一个艰辛的探索过程(有时候确实找不出,其原因是因为数学知识储备不够,另外就是该类题目递推出的数据很大,给出的sample不足以作出结论),这往往需要一些数学方面的储备,以防不测。关于递推的问题有好多,在下边稍稍总结几个。一、斐波那契数列问题描述:除第1,2项外,前n项满足a[n]=a[n-1]+a[n-2],所以递归计算部分源代码就如,int fib(int n){if(n<=1)return n;else return fib(n-1)+fib(n 阅读全文

posted @ 2013-08-05 20:16 金仁赫 阅读(297) 评论(0) 推荐(0)

2013年8月4日

申请帐号的无奈

摘要: 题目介绍:有一帐号申请系统,对于申请帐号的用户名有以下处理,当用户未注册时,系统记录下该用户的申请帐号,当同名用户在进行申请时,因为系统内存在该用户名,则在其姓名后加注出他之外已有的该姓名的用户的个数,存入系统。用户数量n,1#includeusing namespace std;int main(){ int n,i,j,l,sum,maxi; string str[100000]; cin>>n>>str[0]; cout>str[i]; for(j=0,sum=0,maxi=0;j<i;j++)//循环查找有没有同名的,若有存在maxi里; { if( 阅读全文

posted @ 2013-08-04 14:44 金仁赫 阅读(187) 评论(0) 推荐(0)

2013年8月1日

浅谈学习中遇到的递归问题

摘要: 对于算法才刚刚入门的编程学习者而言,我感觉平时的积累是必不可少的。就我自己而言,我对于新的知识有一种想迅速变成自己的思想的冲动,在平时做题时,遇到了新的函数、新的思想,能大大简化自己的程序,比如STL标准模版库的应用,新函数如swap()的应用,还有诸如位运算的大大简化运算步骤等等,我都详细记下,并尽快适用这些新知识应用到自己的程序中。经过几天的学习,对于递归算法我有了初步的理解,对于平时遇到的问题我有以下的总结:1.递归的构成很简单,应用于子函数,含义上即为函数的循环往复的调用自己,在某一个终止条件的控制下跳出调用,回溯计算,理解为函数计算的现场还原。这就要注意终止条件的选择,一般的在积累问 阅读全文

posted @ 2013-08-01 20:33 金仁赫 阅读(294) 评论(0) 推荐(0)

导航