递推与递归DFS

;例题引入:

在跳楼梯问题中,我们假设每次可以跳1级或2级。如果我们想跳到第N级台阶,那么我们的最后一次跳跃只能是1级或2级。

如果我们最后一次跳1级,那么我们必须先跳到第N-1级台阶。由于跳到第N-1级台阶有f(N-1)种方法,因此通过这种方式跳到第N级台阶的方法数也是f(N-1)。

如果我们最后一次跳2级,那么我们必须先跳到第N-2级台阶。类似地,由于跳到第N-2级台阶有f(N-2)种方法,因此通过这种方式跳到第N级台阶的方法数也是f(N-2)。

因此,跳到第N级台阶的总方法数就是这两种方式的方法数之和,即f(N) = f(N-1) + f(N-2)。这正是斐波那契数列的定义。

这个逻辑基于的是这样一个事实:任何到达第N级台阶的路径都可以通过最后一次跳1级或2级从更低级别的台阶到达。由于这两种跳跃方式是互斥的(即最后一次跳跃不能同时是1级和2级),因此我们可以将问题分解为两个子问题,并将它们的解决方案相加来得到原问题的解决方案。

#include<iostream>
using namespace std;
int n;
int fib(int x)
{
if(x==1)
return 1;
if(x==2)
return 2;
return fib(x-1)+fib(x-2);}
int main(){
scanf("%d",&n);
int res=fib(n);
printf("%d\n",res);
return 0;}

注意:scanf与cin

n>10^5时,cin和cout比scanf,printf慢一倍或更多,建议直接用scanf和printf

递归的层数太多会导致时间复杂度过大

分析:每一个数字都有两个选择:选或者不选,所以n个数字一共有2^n中情况

DFS的主要思想是,深度优先

思路:用一个长度为n的数组记录选还是不选

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;
const int N = 20;//构建数组使用
int n;
int st[N];//记录每个数字的状态,0表示暂未考虑,1表示已选,2表示不选这个数int dfs(int x)
{if (x > n)//超出原本范围,跳出分枝打印数字,打印的是最深层的所有情况,例n=3,则打印8种情况{for (int i = 1; i <= n; i++){if (st[i] == 1)//被选中{printf("%d ", i);}}printf("\n");return 0;}//选择该数字的情况st[x] = 1;dfs(x + 1);//确定下一个数字st[x] = 0;//程序回溯,用0表示初始状态//不选择该数字的情况st[x] = 2;dfs(x + 1);st[x] = 0;}
int main()
{cin >> n;dfs(1);system("pause");return 0;
}

全排列问题:

字典序:

例:strcmp字符比较函数,“abc"与”abd",依次按序比较ascii码,abc<abd

思路:1,依次枚举每个位置应该放哪个数。2,依次枚举每个数应该放哪个位置

方法1:

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;
const int N = 20;//构建数组使用
int n;
bool st[N];//布尔类型记录是否被选择
int arr[N];//记录数组int dfs(int x)//当前枚举到的数字
{if (x > n)//超出原本范围,跳出分枝打印数字,打印的是最深层的所有情况,例n=3,则打印8种情况{for (int i = 1; i <= n; i++){printf("%5d  ", arr[i]);//打印当前结果,保留5个场宽}printf("\n");return 0;}for (int i = 1; i <= n; i++)//遍历{if (!st[i])//没被选过,用bool类型可以保证每次选择的数字不与已选数字重复{st[i] = true;arr[x] = i;dfs(x + 1);//下一个位置st[i] = false;//完成后,回溯需要初始化arr[x] = 0;}}}
int main()
{cin >> n;dfs(1);system("pause");return 0;
}

组合练习:

分析:组合不讲究顺序,例 :1,2,3只有一个组合:1和2和3没有顺序

但在本题中,后一个数字比前一个数字要大,则为123

思路:1,依次枚举每个位置应该放哪个数。2,依次枚举每个数应该放哪个位置

以方法2为例:

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;
const int N = 20;//构建数组使用
int n;
int r;
int arr[N];//记录选了哪些数字int dfs(int x,int start)//记录当前枚举到的位置
{if (x > r)//超出原本范围{for (int i = 1; i <= r; i++){printf("%3d  ", arr[i]);//打印当前结果}printf("\n");return 0;}for (int i = start; i <= n; i++)//保证后面的数递增{arr[x] = i;dfs(x + 1,i+1);//下一个位置arr[x] = 0;}}
int main()
{cin >> n>>r;dfs(1,1);//第一个位置从1开始枚举system("pause");return 0;
}

选数

分析: 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;
const int N = 30;//构建数组使用
int n;
int k;
int arr[N];//记录选了哪些数字
int res = 0;
int a[N];//存储原始数据
bool isprime(int sum)
{if (sum < 2)return false;for (int i = 2; i <= sum / i; i++)//判断条件i*i<sum,但是当i数值非常大时有可能超出int范围{if (sum % i == 0)return false;}return true;//不能放在内部判断
}
int dfs(int x, int start)//记录当前枚举到的位置
{int sum = 0;if (x > k)//超出范围,打印结果{for (int i = 1; i <= k; i++){sum += arr[i];}if (isprime(sum)){res++;}return 0;}for (int i = start; i <= n; i++){arr[i] = a[i];dfs(x + 1,i+1);//下一个数字对应下一个数字arr[i] = 0;}}
int main()
{cin >> n>>k;for (int i = 1; i <= n; i++){scanf("%d", &a[i]);}dfs(1,1);//第一个位置从1开始枚举printf("%d", res);system("pause");return 0;
}

剪枝思想:

当已有数字和可选择数字一共的数量<k,则需要剪枝

例:有1,2,3,4,5.第一个空为4,可选择的只有5 ,数量为2<3,则需要剪枝

代码表示:

if((x-1)+n-start+1)<k){return;}

剪枝后可以缩短运行时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/270450.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国制造走向世界wordpress外贸建站模板主题

水泵阀门wordpress外贸网站模板 水泵、阀门、管材、管件wordpress外贸网站模板&#xff0c;适合外贸独立站的网站模板。 https://www.jianzhanpress.com/?p3748 保健器械wordpress外贸网站主题 保健、健身器械wordpress外贸网站主题&#xff0c;适合做外贸网站的wordpress模…

C语言项目实战——贪吃蛇

C语言实现贪吃蛇 前言一、 游戏背景二、游戏效果演示三、课程目标四、项目定位五、技术要点六、Win32 API介绍6.1 Win32 API6.2 控制台程序6.3 控制台屏幕上的坐标COORD6.4 GetStdHandle6.5 GetConsoleCursorInfo6.5.1 CONSOLE_CURSOR_INFO 6.6 SetConsoleCursorInfo6.7 SetCon…

如何使用程序调用通义千问

之前分享了&#xff0c;使用程序调用文心一言。但是很快文心一言就要收费了。阿里的提供了暂时免费版的基础模型&#xff0c;效果还算可以。所以再分享一下&#xff0c;如何使用程序来调用通义千问的模型。 整体很简单&#xff0c;分三步&#xff1a;导入依赖&#xff1b;获取A…

Ubuntu 22.04+cmake3.22+opencv3.4

安装C编译器 查看自己的C编译器版本 cmake --version cmake version 3.22.1 如果没有安装cmake&#xff0c;那么可以使用指令自行安装 sudo apt-get install cmake sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtif…

【开发工具】Git模拟多人开发场景理解分支管理和远程仓库操作

我们来模拟一个多人多分支的开发场景。假设你有一个新的空白远程仓库,假设地址是 https://github.com/user/repo.git。 克隆远程仓库到本地 $ git clone https://github.com/user/repo.git这会在本地创建一个 repo 目录,并自动设置远程主机为 origin。 创建本地开发分支并推送…

Java多线程——synchronized、volatile 保障可见性

目录 引出synchronized、volatile 保障可见性Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——synchronized、volatile 保障可见性 synchronized、volatile 保障可见性 原子性&#xff1a;在一次或者多次操作时…

无人机生态环境监测、图像处理与GIS数据分析

构建“天空地”一体化监测体系是新形势下生态、环境、水文、农业、林业、气象等资源环境领域的重大需求&#xff0c;无人机生态环境监测在一体化监测体系中扮演着极其重要的角色。通过无人机航空遥感技术可以实现对地表空间要素的立体观测&#xff0c;获取丰富多样的地理空间数…

大数据开发-Hadoop之MapReduce

文章目录 MapReduce原理剖析MapReduce之Map阶段MapReduce之Reduce阶段WordCount分析多文件WordCount分析 实战wordCount案例开发 MapReduce原理剖析 MapReduce是一种分布式计算模型,主要用于搜索领域&#xff0c;解决海量数据的计算问题MapReduce由两个阶段组成&#xff1a;Ma…

打造高效、安全的交易平台:开发流程与关键要素解析

在数字化时代&#xff0c;大宗商品交易平台开发/搭建已成为连接买家与卖家的桥梁&#xff0c;为无数企业和个人提供了便捷、高效的交易机会。然而&#xff0c;随着市场的竞争日益激烈&#xff0c;如何打造一个既符合用户需求又具备竞争力的交易平台&#xff0c;成为了众多开发者…

数据处理分类、数据仓库产生原因

个人看书学习心得及日常复习思考记录&#xff0c;个人随笔。 数据处理分类 操作型数据处理&#xff08;基础&#xff09; 操作型数据处理主要完成数据的收集、整理、存储、查询和增删改操作等&#xff0c;主要由一般工作人员和基层管理人员完成。 联机事务处理系统&#xff…

MooC下载pdf转为ppt后去除水印方法

1、从MooC下载的课件&#xff08;一般为pdf文件&#xff09;可能带有水印&#xff0c;如下图所示&#xff1a; 2、将pdf版课件转为ppt后&#xff0c;同样带有水印&#xff0c;如下图所示&#xff1a; 3、传统从pdf中去除水印方法不通用&#xff0c;未找到有效去除课件pdf方法…

【开源物联网平台】FastBee使用EMQX5.0接入步骤

​&#x1f308; 个人主页&#xff1a;帐篷Li &#x1f525; 系列专栏&#xff1a;FastBee物联网开源项目 &#x1f4aa;&#x1f3fb; 专注于简单&#xff0c;易用&#xff0c;可拓展&#xff0c;低成本商业化的AIOT物联网解决方案 目录 一、将java内置mqtt broker切换成EMQX5…

【Web安全】SQL各类注入与绕过

【Web安全】SQL各类注入与绕过 【Web安全靶场】sqli-labs-master 1-20 BASIC-Injection 【Web安全靶场】sqli-labs-master 21-37 Advanced-Injection 【Web安全靶场】sqli-labs-master 38-53 Stacked-Injections 【Web安全靶场】sqli-labs-master 54-65 Challenges 与62关二…

新建Flutter工程修改配置

由于国内 网络环境原因&#xff0c; 新建 flutter工程的 配置文件 需要修改几个地方&#xff0c; 1. gradle-wrapper.properties 问题&#xff1a;Exception in thread "main" java.net.ConnectException: Connection timed out: connect&#xff1a; 解决方法&#…

数组常见算法

一、数组排序 冒泡排序 本篇我们介绍最基本的排序方法&#xff1a;冒泡排序。 实现步骤 1、比较两个相邻元素&#xff0c;如果第一个比第二个大&#xff0c;就交换位置 2、对每一对相邻元素进行同样的操作&#xff0c;除了最后一个元素 特点 每一轮循环后都会把最大的一个…

【STM32详解FLASH闪存编程原理与步骤】

STM32详解FLASH闪存编程原理与步骤 FLASH编程注意事项FLASH编程过程STM32的FLASH擦除过程FLASH全片擦除FLASH操作总结锁定解锁函数写操作函数擦除函数获取状态函数等待操作完成函数读FLASH特定地址数据函数 FLASH编程注意事项 1.STM32复位后&#xff0c;FPEC模块是被保护的&am…

【二】【SQL Server】如何运用SQL Server中查询设计器通关数据库期末查询大题

教学管理系统201703153 教学管理系统数据库展示 成绩表展示 课程表展示 学生表展示 院系表展示 一、基本操作 设置复合主键 设置其他表的主键 设置字段取值范围 二、简单操作 第一题 第二题 第三题 第四题 结尾 最后&#xff0c;感谢您阅读我的文章&#xff0c;希望这些内容能…

网工内推 | 华为成都研究所,24届应届生人才储备计划

华为成都研究所 招聘岗位 网络工程师&#xff08;2024应届&#xff09; 岗位要求 24届的学员 本科公办院校 英语4/6级 有HCIP优先 工作地点 成都 私信小编&#xff0c;回复【内推】&#xff0c;获取内推名额申请资格~ 想获取更多『 思科 | 华为 | 红帽 认证真题 』、『 网…

stl的基本知识学习

1.vector&#xff1a; 2.set&#xff1a; 3.map&#xff1a; 4.栈&#xff1a; 5.队列&#xff1a; 6. unordered_map与unordered_set: 7. 位运算&#xff1a; 8.cctype&#xff1a; 导图&#xff1a;

基础50刷题之一(交替合并字符串)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、题目二、力扣官方题解&#xff08;双指针&#xff09;三、文心一言解释总结 前言 刚上研一&#xff0c;有人劝我好好学C&#xff0c;当时用的不多就没学&a…