二分搜索 #
- poj3258(River Hopscotch) 特殊情况需要专门判断,搜索的结果放在left,left与right不会相等。
- poj3104(Drying) 体会二分搜索的思路,假定可在drytime分钟内全部烘干,算出所有衣服总共需要使用烘干机的时间,看这个时间是否会在drytime范围以内。
- poj1759(Garland) 从数列的前两项就可往下推,第1项已知,第2项需要二分查找(实数域)。
- bailian1064(Cable master) 实数域二分查找,避免四舍五入的技巧。
回溯 #
- bailian4131(Charm Bracelet) 01背包问题,用回溯法实现。
- luogu2819(图的 m 着色问题) 练习图的m着色问题。
- hdu2553(N皇后问题) m叉树回溯,显约束为不同行,隐约束为不同列、不同斜线。显约束控制解空间大小,隐约束是在搜索解空间过程中判定可行解或最优解的。
- hdu2553(N皇后问题) 排列树回溯,显约束为不同行、不同列,隐约束为不同斜线。解空间更小。
- bailian2982(Sudoku) 回溯法搜索数独的解法。 数独中网格编号的处理。回溯过程中只要找到解法,就直接返回,无需继续往下搜索。
- bailian1190(生日蛋糕) 为了更有效的剪枝,需要算出最小体积和面积的前缀和。还要能够根据剩余体积来估计剩余面积。
- bailian1011(Sticks) 1)枚举长度。木棒的总长度为sumlen,最长木棒的长度为maxlen。因为切割后最长为maxlen,那么原木棒的长度必然大于或等于maxlen。如果原木棒只有一根,那么原木棒的长度就是sumlen。如果原木棒多于一根,那么原木棒的长度一定小于或等于sumlen/2。从maxlen到sumlen/2,从小到大枚举所有可能的原木棒长度,通过深度优先搜索尝试能否组合成原木棒,如果尝试成功,则当前木棒的长度为原木棒的最小可能长度。 2)组合顺序。对木棒长度从大到小排序,如果从小到大排序则会超时。因为小木棒比大木棒灵活性更好,所以先考虑较长的木棒,然后用较短的木棒组合成原棒,更容易成功。
BFS #
- Full Tank(bailian3761) 优先队列分支限界法。涉及两个维度的图最短路径,一个是费用,一个是地点。可以把当前节点对应的油量抽象成多个节点(例如在位置0有1升油是一个节点,在位置0有2升油是一个节点),把费用看作边,那么最少费用就可以类似 Dijsktra算法那样不断地加入节点。于是得到一个扩展节点的策略:每次都加 1升油;如果依靠加的油足够走到下一个节点,就走到下一个节点(减去路上消耗的油,花费不变);在广度优先搜索中将所有可扩展的节点都加入优先队列中,如果到达终点,则返回花费。算法优化:用一个数组dp[i][j]表示在节点i、当前油量为j时的最小花费。在当前节点及油量对应的花费更小时才生成节点,生成的节点会少很多.
- Pushing Boxes(bailian1475) 推箱子问题。嵌套BFS,用到多个数据结构。
- Nightmare Ⅱ(hdu3085) 双向BFS,用到了曼哈顿距离,迷宫不能逐个字符读入,要以字符串读入。
启发式搜索 #
- Eight(hdu1043)(A*) 八数码问题。曼哈顿距离,康托尔展开序数,BFS。A*解法。
- Eight(hdu1043)(IDA*) IDA*解法。
- Eight II(hdu3567)(IDA*) 启发函数的计算略有变化。
- Remmarguts’ Date(bailian2449,poj2449) K最短路径问题,先用Dijkstra,再使用A*方法解决。
- Power Calculus(uva1374) IDA*练习题,在DFS基础上增加了剪枝。