摘要:
最近一直在写搜索的题,一直不理想,我觉得原因是:1.对题意理解不到位,有时候往往曲解题意,导致费事费时。2.自己想问题不透彻,不能一步到位,每次写完代码都有bug,各种改,各种不对。3.还是对递归理解的很别扭啊,网上说:写递归要始终把握住两点:1、进入下一级递归的条件;2、递归结束条件。摘了网上的一段话:“递归的主要问题应该是思维的跨度,初学递归时总是喜欢去想细节,甚至脑子里一步一步的跟踪,这对于初学时是不应该的,很多初学者在不相信思维跨度时,也就不相信递归求解是正确的。我感觉学递归最大的问题是信任思维的跨度,直接将前n-1前移了,再去移第n个,一下子移n-1个,我感觉就相当于移1个,只是一种 阅读全文
摘要:
此题中给出一些扑克牌序列,这些序列的尾部如果相同的话,可以用一个节点表示,问如果存储所有这些扑克牌,一共所需多少节点。分析:从每一个序列的尾部开始到首部,建立一个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 阅读全文
摘要:
这个滑雪题做的很恼火呀,TLE了无数,WA了无数。一开始以为要找从最大值到最小值的最大长度,也没有记忆搜索过的点,TLE了。然后发现不对,改成了矩阵中的点到最小值的最大长度,又WA了。最后看了disscuss 中的测试数据,发现自己好sb啊。题目根本没有要求最大值最小值一说,只求的是最大长度,怒!!!还有自己搜索题写的很一般啊,不是,是相当次,必须得强加训练。这道题的题意就像上边所说,求矩阵中从某点开始到某点结束的最大长度,读题要认真啊。分析:dfs+记忆化搜索,没有记忆之前的节点的话,会超时哦。代码:View Code 1 #include <iostream> 2 #inclu 阅读全文
摘要:
题意:坐标中存在点集X,Y(个数相同),每个点都有坐标标识,求边互不相交的完美匹配。分析:这个题让我们联想到KM最小权值匹配,但是又不完全像,如果我们能证明最小权值和的匹配一定不相交的话,这个题就可以转化为kM最小权值匹配。证明:假设A,B属于X点集,C,D属于Y点集,最小权值匹配AC和BD相交于E点,由三角形两边之和大于第三边,可得:AD+BC<AC+BD,这样就与最小权值匹配相矛盾。因此最小权值匹配中不能存在相交的边。得证。证明比较容易,但是写代码的过程中,确遇到了很大的阻碍!!!1.由于边是double型的,这样在比较两个double型的边是否相等时,应该a-b<=eps , 阅读全文
摘要:
这道题的题意是:在一个矩阵空间中,分布着m个人和m个房子,每个房子中要安排一个人,每个人移动一步需要1美元,求为每个人安排房子后所需要的金钱的最小值。分析:这道题乍一看是二分图匹配(还可以用网络流做,现在还不会啊),但是我们学过的KM算法求的是权值最大的匹配,这里求的是权值最小的匹配。怎么办呢?昨天学习了KM算法,如果对原理熟悉的话,其实最大权值和最小权值的道理一样。KM最小权值和算法的原理:1.顶点集分为A,B两个集合,初始化顶标Ai为与Ai相连的边的最小权值,Bi为0.在算法的整个过程中,保证Wij>=Ai+Bi。2.相等子图:如果二分图的某个子图中每条匹配满足Wij=Ai+Bj,那 阅读全文
摘要:
KM算法求完美匹配下的最大权匹配:在一个二分图中,左顶点集为A,右顶点集为B,现对于每组左右连接AiBj有权wij,求一种匹配使得所有wij的和最大。这里的完美匹配:在二分图中,X点集中的所有点都有对应的匹配或者是Y点集中所有的点都有对应的匹配。算法原理:1.若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配。在算法执行过程中的任一时刻,对于任一条边(i,j),A[ i ]+B[j]>=w[i,j]始终成立。2.在求当前相等子图的完美匹配失败时,需要修改顶标值扩大相等子图,具体如下:失败的原因是因 阅读全文
摘要:
这个题的题意是:在一个城镇中有路口和街道,这些街道是单向的并且不会形成环。每一个路口都会降落一名士兵,这些士兵会沿着街道的方向走。求走完所有路口所需要最少的士兵个数。归纳这个题可得为,有向无环图的最小路径覆盖数,可以通过匈牙利算法求得。在建图的过程中,跟无向图的建图类似,但是单向的。以下是代码: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[ 阅读全文
摘要:
路径覆盖定义:在有向无环图中,找出一些路径,使之覆盖图中的所有顶点,并且每个顶点的出度为1.结论:1.一个单独的顶点是一条路径。2.一个覆盖图中存在一条路径p1,p2,...pk,其中P1为起点,pk为终点,那么在该覆盖图中,顶点p1,p2...pk-1的出度为1,即不存在p1,p2...pk指向别的点的情况(覆盖图中)。3.最小路径覆盖就是找出最小的路径条数,使之成为该有向无环图的一个路径覆盖。有向无环图的最小路径覆盖可以通过匈牙利算法解决,注意必须是无环的情况下。公式:最小路径覆盖=定点数-最大匹配数。这里需要注意有向无环图的最小路径覆盖和无向图的最小路径覆盖的区别:有向无环图:求的是最小 阅读全文
摘要:
这个题目的大意是:在一个矩阵中,*代表城市,要对这些城市覆盖无线网,每一个无线网可以覆盖最多两个城市,求将这些城市都覆盖上无线网时需要最小的无线网个数。因为无线网最多可以覆盖两个城市,也就是要找在两个城市中间的一条边,这让我想到了是最短路径覆盖问题,由于没有方向性的问题,所以确定为无向图的最短路径覆盖问题。编程过程中出现了一些问题:1.一开始在选择数据结构的时候考虑不足,开了一个二维数组存储城市的*和O,其实没有必要存储*和o,只需要在这个二维数组中记录城市的标号即可。2.在使用scanf()时出现bug,scanf(“%c”)会接受回车,所以应该在必要的地方用getchar()吸收回车,这个 阅读全文
摘要:
如图,在无向图G=(V,E)中:1.无向图的最小路径覆盖:即图中的极小边覆盖,注意极小边覆盖的定义不是G中的每个顶点有且仅有一条边与它关联!!!2.无向图的最小路径覆盖与二分图的匹配有公式:无向图最小路径覆盖数=顶点数-二分图最大匹配数/2。3.当求一个无向图的最小路径覆盖时,我们就要试图构造一个与这个无向图相一致的二分图:运用拆点的技术,将无向图中的每一个顶点i拆成两个点i和i′(复制),两个点分别属于不同的顶点集。无向图中的边相当于双向边,即将i到j的边拆分成i到j’的边和j到i’的边接下来就可以通过匈牙利算法求出最大匹配数了。 阅读全文