sheet:Search

sheet:Search

二分搜索 #

  • 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,用到了曼哈顿距离,迷宫不能逐个字符读入,要以字符串读入。

启发式搜索 #