递归分解的一些方法 和 回溯 笔记

分解方法:

1 当前处理第一个或最后一个,对其余的递归

2 一分为二,对两边做递归

3 在一系列选择中做一个选择,对更新的状态做递归


回溯问题:

1 Design recursion function to return success/failure

2 At each call, choose one option and go with it

3 Recursively proceed and see what happens

4 If it works out, great! Otherwise, unmake choice and try again

5 If no option worked, return fail result which triggers backtracking (i.e. un-marking earlier decision)


注意:如果题目要求只求出是否可行,而并不要求求出所有的解,这时要有返回值,为了尽快的结束

但如果题目要求求出所有的解,这时就没必要返回值,可以是void。

举例:

1 如果求一个数独是否可解,这时就要有返回值,因为只要找到一个就可以停止了

2 如果要求找到所有数独的解,这时就没必要用boolean返回了。

但是无论哪一种情况,做选择与撤销选择,这个步骤是一定要做的!



Heuristics may help efficiency:

1 Eliminate dead ends early by pruning

2 Pursue most likely choices first.



熟练写出subsetpermutation8皇后模型

还可以参考总结好的 :总结帖:全排列Permutation,子集subset 递归模板


Backtrack pseudocode:

bool solve(configuration conf){
    if(no more choices){         // BASE CASE
        return (conf is goal state);
    }
    
    for(all available choices){
        try one choice c:
        // Solve from here, if works out, you're done!
        if(solve(conf with choice c made))  return true;   // Stop early!
        unmake choice c;
    }
    
    return false;       // tried all choices, no solution found
}


具体例子可参考:

两道递归/回溯好题的分析:printSquaresmaxSum

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值