zoukankan      html  css  js  c++  java
  • UVa11882,Biggest Number

    搜索+剪枝

    如此水的一个题,居然搞了一上午

    出错在bfs与dfs时共用了一个vis数组,导致bfs完后返回dfs应该能访问到的点访问不到

    自己想怎么剪枝,想了几个剪枝方法,又证明,又推翻,再想,再证明,再推翻用了好长时间T T自己还是水的不行啊

    两个剪枝:

    1.若,当前求出来的解now的长度+当前状态下从now节点(因为可能有多个连通块,用vis[]判断未访问到的节点是不行的)开始能访问到的节点的个数(bfs遍历即可)<当然ans的长度,那么剪枝。这样大概能减掉一半的枝叶。但是可能还会超时

    2.在剪枝1的条件下,若==呢?剪枝1时bfs的时候存下所以当前状态下能访问到的点,对这些点降序排序然后接到now后面,那么得到的就是当前状态下可能搜到的最优解,若该解仍小于ans,那么剪枝。又能减掉一大半的枝叶。

    3.前两个剪枝还是超时,实在无奈了,于是又想出了第三个。对所有节点降序排序,也就是从大到小依次枚举节点,若当前ans的长度==节点的总数,并且之后的节点都小于当然节点,那个当然ans肯定是最优解(注意下后面可能还会有节点等于当前节点的情况),之后的就没必要再次dfs了。

    总结:

      这题虽然花了我不少时间,但是也能总结出不少东西。

      剪枝时若当前状态下可能得到的最优解仍然小于ans,那么就可以剪枝。

      这可能就是所谓的最优化剪枝吧。

  • 相关阅读:
    网络编程-python实现-UDP(1.1.2)
    网络编程-python实现-socket(1.1.1)
    1-浮动布局
    1-解决java Scanner出现 java.util.NoSuchElementException
    1.激活函数
    A-交叉熵的使用
    matplotlib的学习16-animation动画
    matplotlib的学习15-次坐标轴
    matplotlib的学习14-图中图
    07-爬虫验证码破解实战
  • 原文地址:https://www.cnblogs.com/acbingo/p/3880512.html
Copyright © 2011-2022 走看看