热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法递推

DFS基本概念步骤优缺点典型例题递推基本概念直接或者间接调用自身的算法称为递归算法一般数据n


DFS

  • 基本概念
  • 步骤
  • 优缺点
  • 典型例题




递推




基本概念

直接或者间接调用自身的算法称为递归算法

  一般数据 n<&#61;30用递归


步骤

在这里插入图片描述


优缺点

优点&#xff1a;结构清晰&#xff0c;可读性强&#xff0c;而且容易用数学归纳法来证明算法的正确性。因此它为设计算法、调试程序带来很大方便。
缺点&#xff1a;运行效率较低&#xff0c;无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。


典型例题


  1. 求 n 的阶乘
  2. 求 斐波那契数列
  3. 求 二叉树相关内容
  4. 汉诺塔问题
  5. 排列 问题

ACWing 练习题

717. 简单斐波那契

#include
#include
#include
#include using namespace std;int n;
int a,b&#61;1,c;int main()
{scanf("%d",&n);while(n--){printf("%d ",a);c&#61;a&#43;b;a&#61;b,b&#61;c;
}return 0;
}

92. 递归实现指数型枚举

#include
#include
#include using namespace std;const int N &#61; 16;int n;
int status[N];//0 表示未使用 1表示选中 2表示未选中void dfs(int u)
{if(u > n)//判断边界{for (int i &#61; 1; i <&#61; n; i &#43;&#43; ){if(status[i]&#61;&#61;1) cout<<i<<" ";}puts("");return ;//一定要结束}status[u]&#61;1;dfs(u&#43;1);status[u]&#61;0;status[u]&#61;2;dfs(u&#43;1);status[u]&#61;0;
}int main()
{cin>>n;dfs(1);return 0;
}

94. 递归实现排列型枚举

#include
#include
#include using namespace std;const int N &#61; 10;int n;
int sta[N];//表示位置 0 未使用 1 ~ n 放了数
bool used[N];//默认是0 0 是未使用 1 是已使用void dfs(int u)
{if (u > n){for(int i &#61; 1; i <&#61; n;i&#43;&#43;) printf("%d ",sta[i]);puts("");return;}for (int i &#61; 1; i <&#61; n; i &#43;&#43; )//遍历枚举分支 因为有多个分支{if(!used[i]){used[i]&#61;true;sta[u]&#61;i;//把该数放入dfs(u&#43;1);used[i]&#61;false;//恢复现场sta[u]&#61;0;}}
}int main()
{cin>>n;dfs(1);return 0;
}

93. 递归实现组合型枚举

#include
#include
#include using namespace std;const int N &#61; 30;int n,m;
int sta[N];void dfs(int u,int start)
{if(u&#43;n-start <m) return;//剪枝if(u&#61;&#61;m&#43;1) //u 从1开始 到 m&#43;1 刚好是 m 个数{for (int i &#61; 1; i <&#61; m; i &#43;&#43; ) printf("%d ",sta[i]);puts("");return;}for (int i &#61; start; i <&#61; n; i &#43;&#43; ){sta[u]&#61;i;dfs(u&#43;1,i&#43;1);sta[u]&#61;0;//恢复现场}
}int main()
{cin>>n>>m;dfs(1,1);return 0 ;
}

1209. 带分数(难)⭐⭐⭐
暴力可以做
优化一下 dfs嵌到也可以做 但是费时


  • 思路
    看成三个数&#xff0c;根据公式能推出 cn&#61;ca&#43;b&#xff0c;因此只需求出c和a就能得出b 缩小了复杂度
    因此先 枚举a&#xff0c;然后枚举c&#xff0c;最后判断b是否成立

#include using namespace std;const int N &#61; 10;int n, ans;
bool st[N]; //记录是否使用
bool backup[N]; //备份数组bool check(int a, int c) //求 b 的值&#xff0c;并且判断没有重复 而且和符合要求
{long long b &#61; n * (long long)c - a * c;if (!a || !b || !c) //都不为0return false;memcpy(backup, st, sizeof st); //复制数组while (b){int x &#61; b % 10; //取个位数b /&#61; 10; //缩小if (!x || backup[x]) //判断 x 是否为0 或是 x 是否被用过return false;backup[x] &#61; true;}for (int i &#61; 1; i <&#61; 9; i&#43;&#43;) //看b 有没有重复的if (!backup[i])return false;return true;
}void dfs_c(int u, int a, int c)
{if (u > 9) //如果十个数都用了return;if (check(a, c)) //看是否符合要求ans&#43;&#43;;for (int i &#61; 1; i <&#61; 9; i&#43;&#43;){if (!st[i]){st[i] &#61; true;dfs_c(u &#43; 1, a, c * 10 &#43; i);st[i] &#61; false; //恢复现场}}
}void dfs_a(int u, int a)
{if (a >&#61; n) //这不是边界return;if (a)dfs_c(u, a, 0);for (int i &#61; 1; i <&#61; 9; i&#43;&#43;){if (!st[i]){st[i] &#61; true;dfs_a(u &#43; 1, a * 10 &#43; i);st[i] &#61; false;}}
}int main()
{cin >> n;dfs_a(0, 0); //第一个表示当前位置 第二个是a的值cout << ans << endl;return 0;
}

推荐阅读
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
author-avatar
jkjkjd_105
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有