zoukankan      html  css  js  c++  java
  • 回溯法

    子集树:2^n(选还是不选的问题)
    排列树:n!

    回溯法参数:
    1.深度参数t
    当t==n时递归结束,产生一个结果,将其加入结果集中。
    2.当前结果
    当t==n时结果完全生成。
    3.结果集
    保存不同搜索路径下产生的结果,通常类型为vector<T>&。

    子集树

    当所给的问题是从n个元素的集合中找出满足某种性质的子集时,相应的解空间称为子集树。
    算法描述为:

    void backtrack(int t){
          if(t==n) output(x);
          else{
                for(int i=0;i<=1;++i){
                x[t]=i;//i=1表示选否则表示不选
                if(满足条件) backtrack(t+1);//若不满足条件则停止向下搜索,剪去该分支
    	    }
          }
    }
    

    子集树问题常见的限制条件:单个集合中无重复元素无重复集合

    排列树

    当所给问题是确定n个元素满足某种性质的排列树时,相应的解空间称为排列树。
    算法描述为:

    void backtrack(int t){
          if(t==n) output(x);
          else{
                for(int i=t;i<n;++i){
                swap(x[t],x[i]);//下标为t的位置元素确定为x[i]
                if(满足条件) backtrack(t+1);//若不满足条件则停止向下搜索,剪去该分支
                swap(x[t],x[i]);//搜索完子树时回溯
    	    }
          }
    }
    

    排列树问题常见的限制条件:无重复排列字典序

    回溯递归的写法

    if(left>0) backtrack(left-1,right,cur+'(');
    if(right>0) backtrack(left,right-1,cur+')');
    
    if (left > 0){
          //string类型有push_back()和pop_back()方法。
          cur.push_back('(');
          backtrack(left-1, right, cur);
          cur.pop_back();
    }
    if (right > 0){
          cur.push_back(')');
          backtrack(left, right-1, cur);
          //下面这一行可以去掉,因为函数已经执行完,不需要继续保证cur不变。
          cur.pop_back();
    }
    

    以上两种写法是等价的。因为第一种写法中没有变量值变化,所以不需要恢复变量。

  • 相关阅读:
    Wwise音频解决方案概述
    图形学中的几何光学理论与视觉现象
    Visual Studio 2015 Tools for Unity使用基础
    C++编译器优化技术:RVO、NRVO和复制省略
    【ElasticSearch】 ElasticSearch基本概念和RESTful API(四)
    【ElasticStack】入门介绍(三)
    【Java】开发一个Java-SDK
    【Java】Maven 打包可运行jar包
    【SpringBoot】Spring Boot Admin 微服务应用监控
    【Java面试题】方法的参数传递机制
  • 原文地址:https://www.cnblogs.com/Frank-Hong/p/13299915.html
Copyright © 2011-2022 走看看