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,那么就可以剪枝。

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

 

posted @ 2014-07-31 12:01  ACBingo  阅读(342)  评论(0编辑  收藏  举报