zoukankan      html  css  js  c++  java
  • 递归方法和回溯方法模板

    递归和回溯的应用场景

    • 二叉树的遍历
    • 归并排序、快速排序
    • 动态规划
    • 二分搜索

    复杂度计算

    复杂度计算方法,需要等差数列、等比数列的知识。

    递归

    function fn(n){
    	//第一步:完整性检查,判断输入或者状态是否非法?
    	if(input/state is invalid){
    		return;
    	}
    	
    	//第二步:判断递归是否应当结束?
    	if(match condition){
    		return some value;
    	}
    	
    	//第三步:缩小问题规模,递归调用
    	result1 = fn(n1);
    	result2 = fn(n2);
    		
    	//第四步:整合结果
    	return combine(result1,result2);
    }
    

    回溯

    1、首先判断当前情况是否非法,如果非法就立即返回
    2、看看当前情况是否已经满足条件?如果是,就将当前结果保存起来并返回
    3、在当前情况下,遍历所有可能出现的情况,并进行递归
    4、递归完毕后,立即回溯,回溯的方法就是取消前一步进行的尝试

    function fn(n){
    	//第一步:完整性检查,判断输入或者状态是否非法?
    	if(input/state is invalid){
    		return;
    	}
    	
    	//第二步:判断递归是否应当结束?
    	if(match condition){
    		return some value;
    	}
    	
    	for(all possible cases){//遍历所有可能出现的情况
    		//第三步:尝试下一步的可能性
    		solution.push(case);
    		result = fn(m);//递归
    		//第四步:回溯到上一步
    		solution.pop(case);
    	}
    }
    
  • 相关阅读:
    12.27 cf div3 解题报告
    网络流24题 P2754 [CTSC1999]家园
    P3690 【模板】Link Cut Tree (动态树)
    P2147 [SDOI2008]洞穴勘测
    P3203 [HNOI2010]弹飞绵羊
    P4172 [WC2006]水管局长
    P3979 遥远的国度
    P3128 [USACO15DEC]最大流Max Flow
    P3178 [HAOI2015]树上操作
    [SDOI2014]旅行
  • 原文地址:https://www.cnblogs.com/dindin1995/p/13059100.html
Copyright © 2011-2022 走看看