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

分支因子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来存放每个节点的所有满足条件的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值