随笔分类 -  Poj

摘要:最近一直在写搜索的题,一直不理想,我觉得原因是:1.对题意理解不到位,有时候往往曲解题意,导致费事费时。2.自己想问题不透彻,不能一步到位,每次写完代码都有bug,各种改,各种不对。3.还是对递归理解的很别扭啊,网上说:写递归要始终把握住两点:1、进入下一级递归的条件;2、递归结束条件。摘了网上的一段话:“递归的主要问题应该是思维的跨度,初学递归时总是喜欢去想细节,甚至脑子里一步一步的跟踪,这对于初学时是不应该的,很多初学者在不相信思维跨度时,也就不相信递归求解是正确的。我感觉学递归最大的问题是信任思维的跨度,直接将前n-1前移了,再去移第n个,一下子移n-1个,我感觉就相当于移1个,只是一种 阅读全文
posted @ 2012-07-23 12:03 pushing my way 阅读(678) 评论(0) 推荐(0)
摘要:此题中给出一些扑克牌序列,这些序列的尾部如果相同的话,可以用一个节点表示,问如果存储所有这些扑克牌,一共所需多少节点。分析:从每一个序列的尾部开始到首部,建立一个trie树,trie树的节点个数为ans。此题还用了hash的思想,需要把扑克序列hash到int。看到别人有用map<string,int>hash的。感觉建立hash表有些麻烦啊。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <stack> 4 #include <string> 5 阅读全文
posted @ 2012-07-22 10:11 pushing my way 阅读(576) 评论(0) 推荐(0)
摘要:这个滑雪题做的很恼火呀,TLE了无数,WA了无数。一开始以为要找从最大值到最小值的最大长度,也没有记忆搜索过的点,TLE了。然后发现不对,改成了矩阵中的点到最小值的最大长度,又WA了。最后看了disscuss 中的测试数据,发现自己好sb啊。题目根本没有要求最大值最小值一说,只求的是最大长度,怒!!!还有自己搜索题写的很一般啊,不是,是相当次,必须得强加训练。这道题的题意就像上边所说,求矩阵中从某点开始到某点结束的最大长度,读题要认真啊。分析:dfs+记忆化搜索,没有记忆之前的节点的话,会超时哦。代码:View Code 1 #include <iostream> 2 #inclu 阅读全文
posted @ 2012-07-22 10:00 pushing my way 阅读(632) 评论(0) 推荐(1)
摘要:题意:坐标中存在点集X,Y(个数相同),每个点都有坐标标识,求边互不相交的完美匹配。分析:这个题让我们联想到KM最小权值匹配,但是又不完全像,如果我们能证明最小权值和的匹配一定不相交的话,这个题就可以转化为kM最小权值匹配。证明:假设A,B属于X点集,C,D属于Y点集,最小权值匹配AC和BD相交于E点,由三角形两边之和大于第三边,可得:AD+BC<AC+BD,这样就与最小权值匹配相矛盾。因此最小权值匹配中不能存在相交的边。得证。证明比较容易,但是写代码的过程中,确遇到了很大的阻碍!!!1.由于边是double型的,这样在比较两个double型的边是否相等时,应该a-b<=eps , 阅读全文
posted @ 2012-07-21 08:47 pushing my way 阅读(556) 评论(0) 推荐(0)
摘要:这道题的题意是:在一个矩阵空间中,分布着m个人和m个房子,每个房子中要安排一个人,每个人移动一步需要1美元,求为每个人安排房子后所需要的金钱的最小值。分析:这道题乍一看是二分图匹配(还可以用网络流做,现在还不会啊),但是我们学过的KM算法求的是权值最大的匹配,这里求的是权值最小的匹配。怎么办呢?昨天学习了KM算法,如果对原理熟悉的话,其实最大权值和最小权值的道理一样。KM最小权值和算法的原理:1.顶点集分为A,B两个集合,初始化顶标Ai为与Ai相连的边的最小权值,Bi为0.在算法的整个过程中,保证Wij>=Ai+Bi。2.相等子图:如果二分图的某个子图中每条匹配满足Wij=Ai+Bj,那 阅读全文
posted @ 2012-07-20 09:00 pushing my way 阅读(1199) 评论(0) 推荐(0)
摘要:这个题的题意是:在一个城镇中有路口和街道,这些街道是单向的并且不会形成环。每一个路口都会降落一名士兵,这些士兵会沿着街道的方向走。求走完所有路口所需要最少的士兵个数。归纳这个题可得为,有向无环图的最小路径覆盖数,可以通过匈牙利算法求得。在建图的过程中,跟无向图的建图类似,但是单向的。以下是代码:View Code 1 #include <iostream> 2 #include <memory.h> 3 #include <stdio.h> 4 using namespace std; 5 6 bool array[121][121]; 7 int res[ 阅读全文
posted @ 2012-07-19 15:49 pushing my way 阅读(478) 评论(0) 推荐(0)
摘要:这个题目的大意是:在一个矩阵中,*代表城市,要对这些城市覆盖无线网,每一个无线网可以覆盖最多两个城市,求将这些城市都覆盖上无线网时需要最小的无线网个数。因为无线网最多可以覆盖两个城市,也就是要找在两个城市中间的一条边,这让我想到了是最短路径覆盖问题,由于没有方向性的问题,所以确定为无向图的最短路径覆盖问题。编程过程中出现了一些问题:1.一开始在选择数据结构的时候考虑不足,开了一个二维数组存储城市的*和O,其实没有必要存储*和o,只需要在这个二维数组中记录城市的标号即可。2.在使用scanf()时出现bug,scanf(“%c”)会接受回车,所以应该在必要的地方用getchar()吸收回车,这个 阅读全文
posted @ 2012-07-19 11:26 pushing my way 阅读(907) 评论(0) 推荐(0)
摘要:这道题是一个基本的匈牙利算法,求最大二分匹配。之前在算法导论中学习网络流,明白了网络流中的残留网络,增光路和割,但是去模拟书上的伪代码感觉很是费力。就打算从最基本的匈牙利算法做起。下面先介绍一下匈牙利算法:该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法:匹配是边集的子集。设M是图G的一个匹配,需要掌握一下几个概念:1.M-交错路:M-交错路是一条通路,这条通路中的边为属于M与不属于M但属于G的边交替出现。2.M-饱和点:M-饱和点是与M中的某条边相关联的点。否则是非M-饱和点。3.M-可增广路:M-交错路的起点和终点都是非M-饱和点。设P是M-可增广路,则可以得出以下三 阅读全文
posted @ 2012-07-13 21:49 pushing my way 阅读(872) 评论(0) 推荐(0)
摘要:这个题昨天做过,但是今天使用的是RMQ_ST算法,网上关于RMQ还有中笛卡尔树的算法,今天我用的是ST算法,这个算法很给力,在初始化之后可以在O(1)的时间内求出最大值和最小值。先简要介绍一下ST算法,ST算法需要辅助数组f[i][j]表示从第i个元素开始连续2^j个元素中的最大值(这里以最大值举例),有:1.初始 f[i][0]=a[i]2.对于f[i][j] j>0 有f[i][j]=max( f[i][j-1] , f[i+2^(j-1)][j-1] ),当然每次比较之前必须保证i+2^(j-1)<=n中在初始化的过程中 j:1--m 这样保证f[1][1]=max(f[1] 阅读全文
posted @ 2012-07-12 19:10 pushing my way 阅读(211) 评论(0) 推荐(0)
摘要:昨晚写了一个线段树的程序,各种bug,最后硬是AC了,这个题的大意是这样的:给n个数字,然后在给出一些区间范围(s,e),求出在这个区间范围内的最大值和最小值,总结一下这个题,我一共有5个bug1.建立线段树时,类似完全二叉树,一开始我开的数组是最大数字个数的2倍多一点,然后开始悲剧,每当程序执行到Build_Tree()时就死了,一开始百思不得其解,后来自己用手模拟了一下建树的过程,发现虽然类似完全二叉树,但还不都是。完全二叉树只有最底层是叶子节点,但是线段树不一定,比如对(1,6)建树,模拟一下就会知道,最后改成开成3倍就OK了,纠结啊。2.第二个问题是编程基础不好导致的,我在初始化时就对 阅读全文
posted @ 2012-07-12 18:52 pushing my way 阅读(218) 评论(0) 推荐(0)
摘要:这个题是NP旅行商问题的简化版,求的是一个矩阵上的最短的路径。NP旅行商问题是Given a set of N towns and roads between these towns, the problem is to compute the shortest path allowing a salesman to visit each of the towns once and only once and return to the starting point.只不过这道题是将这N towns 放在了一个矩阵上,这样可以找到规律,如下:设矩阵为M*N,如果M和N都是奇数,那么最短的路径中 阅读全文
posted @ 2012-07-11 15:31 pushing my way 阅读(259) 评论(0) 推荐(0)