《算法竞赛入门经典》7.4回溯法

来源:互联网 发布:for循环遍历二维数组 编辑:程序博客网 时间:2024/04/29 04:26

分支因子b 和 层数L,则最终的解答树节点总量为 (b^L-1)/(b-1)

八皇后技巧 主对角线在一条线上 cur-C[cur]==j-C[j],副对角线cur+C[cur]==j+C[j]

也可用个vis[][]来存储三种违规情况的出现,但结束这次访问时一定要改回去,这不同于求子集,这个是要你统计总共有多少条不同的方法,即使后面他门前面有相同的部分也是两种不同的方法。因为顺序不同

Uva524素数环水题技巧因为n最大也才32,可以先通过先生成32以内的素数表,然后存到一个数组中,下次直接访问,不剪枝12就很慢,16出不来,有个很厉害的剪枝就是每次放的时候就判断和前面一个是否构成素数,这个因为条件比较高,能减少许多无用状态,可以算到18。
UVa129困难的串如果以前肯定暴力了,但是的确每次增加后等于又要把上个状态的算了一遍,然后因为这个算法生成的串就是按照字典序出来的所以主要耗时的部分就是判断是否合法,优化是每次增加一个只需判断这个字符是否构成容易的串就行了
UVa140刚开始以为是图= =单后发现这个距离值得是在序列中的间隔= =必须排到序列中才能知道,然后一定要剪枝26!= =太大了,最厉害的剪枝就是先求一个解,以后不断优化使这个变小,如果在某部分序列已经有带宽大于这个解的直接减掉其他优化还可以是如果一个点的节点特别多,所以应该分布在他的两边才对,如果你发现一个节点特别多的然后,他还有m个没有排列,但是m大于目前最优解,这个也要减掉
UVa1354这题重要的是技巧为什么设置vis因为这个只需访问一遍,下次还需要访问时,直接调用结果就行了,技巧是总的状态是1<<s-1,然后通过for (int left = (subset - 1)&subset; left; left=(left - 1)&subset)    {        have_child = true;        int right = left^subset;来得到每种状态结构体写个Tree()这个构造函数是为了当没有儿子节点时直接插入。总共有tree[1<<s-1]个节点,用tree来存放每个节点的所有满足条件的。
0 0
原创粉丝点击