热门标签 | 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;
}

推荐阅读
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
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社区 版权所有