摘要: 随着对它的记忆加深,对KMP的模板做法也有所感触,类型是一样的,做法也是模板做法,处理的也只是细节问题而已,其实也就是这些细节是需要想的、处理的,不然就是一题了,上篇要求是看是否有子串,如果有返回此子串在另一数串的最先开始的位置,这题与上题要求不同,能出现的次数,而且只要不是同一位置的情况下都算(看了题,应该可以明白这个意思的),不过我感觉应该好处理的,就是i变化是处理妥当就行;题目链接: http://poj.org/problem?id=3461代码如下:#include<stdio.h>View Code 1 #include<string.h> 2 int le 阅读全文
posted @ 2011-08-15 20:43 world_ding 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 今天刚接触到KMP,很是棘手,于是百度了一篇广受关注的文章,看了许久,倒是明白一丁点走的过程,不过不太明白为什么会这样走,于是就想找到试题来实践一下,提到是找到了,很简单的题,不过对我来说还是有一定难度的,毕竟连理论还没看懂,于是便按理论上来写,很久了也没见运行正确过,于是有百度了一篇代码,看了之后很是震惊,原来我只写了开始,于是看了他的代码,虽然暂时不太懂为什么这样走,不过我还是相信慢慢的会理解的,鉴于我记性稍微够用的情况下按照他的代码先记了下来,慢慢理解罢了:题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1711KMP视频链接处: ... 阅读全文
posted @ 2011-08-15 16:45 world_ding 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 截至到目前为止,对图论已经看到六种算法了,第一种就是自己很理解的并查集算法,上面的题中自然有提到,第二种便是dijkstra算法,当然上面题中依然有提到的,第三种便是floyd算法,至于这个经典算法,当然也要会用点的,第四种便是接下来要说的prim算法,至于第五种的拓扑排序和krustkal算法,目前还没用过,这里暂不提;题目链接: http://poj.org/problem?id=2395这一题的大致就是从一个庄园到另一个庄园,在每个庄园都可以装水,求要经过所有庄园要求所带的水尽量少,求在这种尽量小的情况下拿水最多的一次,并且所有庄园都可以由1号庄园到达;这里用了... 阅读全文
posted @ 2011-08-14 09:50 world_ding 阅读(810) 评论(0) 推荐(1) 编辑
摘要: Bus System题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1690View Code # include<stdio.h># include<string.h>#define Max 0x7fffffffffffff///第一不用“;”,第二,这是64位,是个很大的数__int64 L1,L2,L3,L4,C1,C2,C3,C4;///这里尽量用__int64__int64 map[120][120]; ///__int64 point[120]; ... 阅读全文
posted @ 2011-08-13 09:31 world_ding 阅读(206) 评论(0) 推荐(1) 编辑
摘要: 本以为用并查集,于是兴致勃勃写了并查集的做法,由于给的测试实例太弱,于是测试没问题就交了,结果WA,于是百度一下,发现大部分人用的是拓扑排序和floyd算法,于是满怀信心的学拓扑,结果整了一个晚上没明白,第二天依然不太明白,于是改学拓扑,代码也不太好理解,便问了同志们,他们说自己也是不太理解,就这样用了,当模板了,于是便想先用着吧,希望再用的过程中会理解点什么;下面提供一下我自己对dijkstra和floyd的理解;对于dijkstra算法概要就是要定义一个二维数组和一个一维数组;二维数组就是把从第i到第j的路径的权值记下来,而且从i到j与从j到i是一样的,一维数组就是记录从i到j的最小(或最 阅读全文
posted @ 2011-08-12 16:37 world_ding 阅读(530) 评论(1) 推荐(0) 编辑
摘要: 免费馅饼题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1176 有上个对数塔的理解,这个也可以用数塔处理,大致是相似的:View Code # include<stdio.h># include<string.h>int dp[100010][13];int max(int a,int b){ if(a>b) return a; return b;}int main(){ int n,i,j,k,m,t; while(scanf("%d",&n),n) { memset(d... 阅读全文
posted @ 2011-08-11 09:52 world_ding 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 数塔题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=2084前不久,遇到一个DP题,当时没想到是数塔,没思路之下便搜了一部分代码,看到有个和数塔类似的做法,便学了那个自上往下处理的方法;巧的是在一次竞赛中出现了那题,结果过不去,我自己出的数据也过不去,本以为我自己写错了程序,没想到竞赛结束后用那个代码运行我的那个数据竟然是错的答案;后来问了别人,别人说那个算法是错的,之所以之前对,那是测试实例太弱;所以有很加学习了数塔,希望这次是学有所得,受打击了错不起了,不想错了:这个DP应该也可以,只是为了感受或者说用下数塔,代码如下:... 阅读全文
posted @ 2011-08-11 09:45 world_ding 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2066基于上个对图论的理解(hdu2544),这个就是多实例,多站点的最短路径问题,依然可以用dijkstra算法,具体的dijkstra在上几个分别针对不同方向有较详细的讲解;这题的解法与上个类似,这里就不过多的分析,下面针对代码的部分处理做出各点的详细解释;代码+注释如下:View Code # include<stdio.h># include<string.h>int map[1200][1200];//能开到1200*1200让我很意外int flag[1200] 阅读全文
posted @ 2011-08-10 10:37 world_ding 阅读(288) 评论(0) 推荐(1) 编辑
摘要: 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2544这一题与上面一题hdu2112大有相似之处,都是用了dijkstra算法,重要点依然是对dijkstra更新过程的理解:也就是对for(i=0;i<n;i++){ if(flag[j]==0&&count[j]>count[k]+map[k][j]); count[j]=count[k]+map[k][j];} 的理解,在这里map[][],是以二维数组形式记录了任意2点之间的距离,对于2点无法连通的我们初始化为一个较大的数(这里选了100000... 阅读全文
posted @ 2011-08-10 08:32 world_ding 阅读(271) 评论(0) 推荐(1) 编辑
摘要: 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2112这一题与上面的图论的题有很大不同,对于这一题对于这题有两种解法,Dijkstra算法或者floyd算法,只是我也没理解好,在别人的帮助下勉强整出dijkstra算法解这一题,由于题目本身比上几个稍微难理解点,所以附上dijkstra算法的课件的部分;Dijkstra算法依最短路径的长度递增的次序求得各条路径。设置一个集合S,该集合中存放从给定源点出发最短路径已知的所有顶点。因此算法开始时,集合S中只有源点一个顶点。随着算法的进行,其余的顶点被逐步加入集合S。因此算法要解... 阅读全文
posted @ 2011-08-09 20:01 world_ding 阅读(266) 评论(0) 推荐(0) 编辑