递归回溯 暴力枚举 (总结)

来源:互联网 发布:java创建对象 编辑:程序博客网 时间:2024/06/05 20:49

怎么说呢?  一点一点记吧,哪些要注意的记下来以后再给自己翻翻的时候看的。

总之! 不能让一个坑把你绊倒无数次。

 

回溯法:

      1、经常用到的  next_permutation() : 生成全排列的,是按升序生成的, 要注意与pre_permutation() 的区别,降序和升序,一般情况下用前面那个就行了。但是!!千万注意,在枚举所有情况进行深搜的时候,数组A的第一次,也就是在第一次用next_permutaion() 之前,要进行一次深搜,因为那个函数只是用来生成下一个排列, 所以不能漏了深搜第一次情况。

     2、还有一个很重要的是,理解题目意思,是要枚举全排列,还是组合就行,如果题目的意思要用的是组合,而你用了全排列,那就很有可能TLE....这些都是曾经栽过的跟头,下次绝对注意!!

    3、递归的入口和出口, 进入的时候的形参和出来的答案是否遍历所有该遍历的,或者说完成了一次深搜(也就是完成了一次所有该选的数据, 比如八皇后的一次枚举就是选齐八个皇后,本题则是连接了所有的点),当然在所有遍历完后是否得到了正确答案

   4、对解答树的理解很重要,我也在努力,试着在每次做题前刻画出,至少要想清楚解答树是怎样的,这样才好一步一步往下深搜,比如选币值那题,对于新的一张不同的面值,是否该选取这张,这就是解答树往下生成的原因,因为不同的选择导致了最后不同的选择结果。。。这一点在构造递归函数的时候很重要!!!!

 

  后续补充吧。。。边刷题边记坑。。。每次记录,每次翻阅,都是在提醒自己!。。加油。。。

原创粉丝点击