常用技巧——剪枝
文章平均质量分 81
XDU_Skyline
Everything is over, everything is just beginning.
展开
-
例题7-6 带宽 UVa140
1.题目描述:点击打开链接 2.解题思路:原来按照紫书上的原创 2014-09-08 13:26:57 · 849 阅读 · 0 评论 -
例题7-10 编辑书稿 UVa11212
1.题目描述:点击打开链接 2.解题思路:本题利用迭代加深搜索,也是一道典型的状态空间搜索问题,状态就是1~n的排列,初始状态是输入,终止状态是1,2,……n。由于n≤9,排列最多有9!=362880个,但由于每个状态的后继状态比较多,因此仍有TLE的危险。本题如果利用迭代加深搜索,可以发现做多只需要8步,关键在于如何有效地剪枝。考虑后继不正确的数字的个数h,可以证明每次剪切时h最多减少3(因为原创 2015-02-06 10:40:56 · 1388 阅读 · 0 评论 -
例题7-13 快速幂计算 UVa1374
1.题目描述:点击打开链接 2.解题思路:本题利用迭代加深搜索,代码类似于枚举全排列的代码(但不是我想到的==),由于本题实际上相当于枚举指数,因此可以利用已经拥有的指数集合,通过加法,减法两种情况去枚举新的指数;迭代加深搜索的关键点在于剪枝,如果当前指数集合中的最大值乘以2的maxd-d次方仍然小于n,则需要剪枝,同时,如果恰好等于n的话,那么直接就找到了解是maxd。最后说一句:本题代码原创 2015-02-02 23:46:00 · 797 阅读 · 0 评论 -
习题7-15 最大的数 UVa11882
1.题目描述:点击打开链接 2.解题思路:本题利用“DFS+剪枝”解决。本题要求在一个矩阵中找到一条数字链,使得它尽量大。不难想象,如果只是单纯地用dfs进行盲目的搜索,那么时间复杂度将是N!级别的,这里的N代表矩阵中所有数字的个数。时间上开销太大,难以承受。需要优化。 那么本题该怎么优化呢?通过观察易知,本题有两处可以进行优化,假设已经找到的答案数组是b,目前尝试的数组是c,当前要填的位置是原创 2015-04-19 14:15:09 · 1526 阅读 · 1 评论 -
例题7-12 旋转游戏 UVa1343
1.题目描述:点击打开链接 2.解题思路:本题利用迭代加深搜索解决。好久没做这个专题了,感觉这种方法有点力不从心,不会寻找估价函数是硬伤。。。只好学一学别人的代码。 本题要求棋盘中间的8个方格都要是相同的数字。紫书上说是利用状态空间搜索解决,大致模板还是八数码问题的模板。但是写了半天最后WA了,感觉这道题用那个模板写出来会很复杂。最后看别人的代码,才发现大多都是利用迭代加深搜索解决的,代码量也原创 2015-04-11 15:59:52 · 1583 阅读 · 1 评论 -
例题6.7 冰人 HDU2936
1.题目描述:点击打开链接 2.解题思路:本题是一道很经典的路径寻找问题,利用A*算法解决。即BFS+利用估价函数剪枝。做本题的第一个障碍是题意比较复杂,需要事先在草稿纸上理清头绪,弄清楚这4种操作,每种操作又分哪些特殊情况。还要弄清楚4种冰块是怎么转换的。这样,弄清楚这些细节,才能够写出鲁棒的扩展状态的函数。 接下来,就是如何利用BFS来寻找路径了。首先要弄清楚怎么保存一个状态,应该原创 2015-08-11 11:58:17 · 635 阅读 · 0 评论 -
习题7-14 小木棍 UVa307
1.题目描述:点击打开链接 2.解题思路:本题是一道非常经典的回溯法+剪枝的搜索题目。根据题意,我们可以注意到有下面4处重要的剪枝: (1)把所有的木棍从大到小排序,优先使用长木棍,这样可以加快组合速度,而且对后面的剪枝有帮助。 (2)在枚举可能的长度时候,范围在[maxlen,sum/2]之间,如果都没有,那么答案只能是sum。 (3)拼出的木棍长度一定是sum的约数。 (4)在dfs原创 2015-10-11 00:05:30 · 1200 阅读 · 0 评论