现在的位置: 首页 > 综合 > 正文

DFS——经典例题分析及总结

2014年03月09日 ⁄ 综合 ⁄ 共 4401字 ⁄ 字号 评论关闭

一:(HDU 1045)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1045

题目是让你求给定图中如何放置大炮,使得可放置的大炮数目最多,并求出最多的大炮数目。其中大炮可横向和竖向攻击。

         写这道题主要是因为这道题运用新的方法。采用了坐标标号化、即不再向以往的那样对坐标进行搜索,而是将坐标转化为标号,搜索标号了。转换方法(坐标从(00)开始x=number/num, y=number%num;number即该坐标编号)。而递归边界的判断也转化为了编号越界的判断。仔细想想也真他妈是个好方法、至少对ACM新人来说。

该题代码:

 

 

二:(HDU 1455)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1455  http://poj.org/problem?id=1011

         题目大意是有一些等长的木棍,被切成一些已知长度的小木棍(最大不超过50,这个条件也很重要)。求最小可能原长。

         做这个题目的关键在与剪枝。有大妞说DFS不难,关键在于剪枝,从这道题目里面我深有体会。同样的代码在HDU上能AC,拿到PKU就超时,后来想了老久才想出一个优化,最终在PKU上也AC了。不容易啊!另外这也是一道DFS函数定义为bool类型最典型的题目。

         首先能想到的优化就是一个木棍一个木棍的完成,比起一根一根的添,节省了好多不必要的判断。其次我们还会想到先求处长木棍的可能长度都有哪些,我们只枚举这些长度即可。再次题目时要求我们求最小的,那么我们就从最小的可能长度开始枚举,这样一来,有会发现一个优化,那就是将所有的短木棍从大到小先排个序,这样又能加快判断。能想到的也就这么多了,果然这样写出的代码拿到HDU15msAC。然而这样的代码在PKU上却是TLE。我们发现数据中的短木棍有大小相同的木棍,如果这根木棍添加没有成功的话,那么和它相同的那根显然也不能成功。就像上面第一道题一样。这样优化后PKU上就轻松AC了。

下面是代码:

三:(HDU 1010)

 

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1010

本来是一道好题,被HDU整成SB了。现在咋改都不过,我还在纠结要不要写这个题。这题不看题解估计新手很难AC,至少我不知道什么奇偶剪枝。这题的两个重要剪枝是先BFS判断最短是能不能逃生,若最短都逃不了,那就怎么都逃不了。其次就是奇偶剪枝,每走一步都判断其最短路能不能逃生(即是否偶数)。有了这两个剪枝,这题就可以了(以前可以了)。

奇偶剪枝:任意时刻,abs(ex-x)+abs(ey-y)都表示当前点p和逃生点ep之间的二维距离,可以证明,这时当前点p到逃生点ep之间的最短距离!记此最短距离长度为s。如果,此最短距离上有一些障碍物不能走,那么移动会偏移最短距离s,但是不管偏移几个点,偏移的距离都是最短距离s加上一个偶数距离

代码如下:

 

抱歉!评论已关闭.