递推与递归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.mzph.cn/news/726017.shtml

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

相关文章

【React】react的生命周期

react的生命周期 一、新生命周期1、挂载阶段1.1 constructor&#xff08;1&#xff09;在React组件挂载之前被调用&#xff08;2&#xff09; 初始化函数内部 state或者在this上挂载方法 1.2 getDerivedStateFromProps&#xff08;1&#xff09;为静态方法&#xff0c;不能访问…

快速了解Redis

Redis是什么&#xff1f; Redis是一个数据库&#xff0c;是一个跨平台的非关系型数据库&#xff0c;Redis完全开源&#xff0c;遵守BSD协议。它通过键值对(Key-Value)的形式存储数据。 它与mysql数据库有什么区别&#xff1f; redis通过键值对(Key-Value)的形式存储数据&…

springboot源码解析之Model和Map参数解析

springboot源码解析之Model和Map参数解析 标签:源码:springboot 测试代码 Controller public class HelloController {RequestMapping("/helloModelAndMap")public String helloModelAndMap(HttpServletRequest request, Model model, Map<String, Object> …

万物皆可Find My,伦茨科技ST17H6x芯片赋能产品苹果Find My功能

苹果的Find My功能使得用户可以轻松查找iPhone、Mac、AirPods以及Apple Watch等设备。如今Find My还进入了耳机、充电宝、箱包、电动车、保温杯等多个行业。苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、Ai…

[ISP]DCT离散余弦变换及C++代码demo

1.基本定义 离散余弦变换(DCT for Discrete Cosine Transform) DCT&#xff08;Discrete Cosine Transform&#xff0c;离散余弦变换&#xff09;是一种常用的信号处理技术&#xff0c;广泛应用于图像处理、音频处理、视频压缩等领域。DCT将一个信号或数据序列从时域&#xf…

TensorFlow 与pytorch

TensorFlow 与pytorch 介绍 TensorFlow 的基本概念和使用场景python 搭建 tensorflow 介绍 pytorch 的基本概念和使用场景PyTorch中搭建模型 TensorFlow与pytorchTensorFlow与pytorch的区别TensorFlow与pytorch的联系TensorFlow与pytorch各自的开发团队TensorFlow与pytorch之外…

【Tauri】(5):本地运行candle和 qwen 大模型,并测试速度

1&#xff0c;本地运行candle 关于candle项目 https://github.com/huggingface/candle Hugging Face 使用rust开发的高性能推理框架。 语法简单&#xff0c; 风格与 PyTorch 相似。 CPU 和 Cuda Backend&#xff1a;m1、f16、bf16。 支持 Serverless&#xff08;CPU&#xff…

Angular变化检测 2.0版本学习

在学习如何在Angular中实现文字逐字显示的过程中&#xff0c;我发现要保证用户的体验感的关键点在于&#xff1a;如何确保实时更新.html页面的内容显示&#xff0c;保证及时在UI界面反应出后端返回的数据? 那如何解决这个问题呢&#xff1f;其实我在博客中有提到过这个问题的…

简单两步,从补税到退税

大家好&#xff0c;我是拭心。 最近到了一年一度的个人所得税年度申报时期&#xff0c;有人可以退好几千&#xff0c;而有的人则需要补上万元&#xff0c;人类的悲喜这一刻并不相通。 我申报的时候&#xff0c;提示我需要补税一万多&#xff0c;心有不甘但差一点就认了&#xf…

java SSM科研管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM科研管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

每天学习一个Linux命令之kill

每天学习一个Linux命令之kill 介绍 在Linux系统中&#xff0c;kill命令用于终止或发送信号给正在运行的进程。它是管理进程的一个重要工具&#xff0c;允许用户通过发送信号来控制进程的行为。本文将详细介绍kill命令可用的选项及其用法。 命令格式 kill [选项] <进程ID…

Python基础面试编程知识-杂

文章目录 1、 循环 1-100求和2、删除字典键 del3、合并字典update4、列表去重5、函数中 (*args,**kwargs)的意义6、python2和python3中的range函数区别7、什么样的语言能够用装饰器8、python内建数据类型9、__init__,__new__10、with 方法11、python 中可变数据类型和不可变数据…

796.子矩阵的和(acwing)

文章目录 796.子矩阵的和题目描述前缀和 796.子矩阵的和 题目描述 输入一个 n 行 m 列的整数矩阵&#xff0c;再输入 q 个询问&#xff0c;每个询问包含四个整数 x1,y1,x2,y2&#xff0c;表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输…

selenium鼠标操作实战

鼠标操作实战 鼠标单击操作 click()内置鼠标操作包ActionChains鼠标双击操作double_click()鼠标右击操作context_click()鼠标指针悬浮操作move_to_element(ele)鼠标拖动操作drag_and_drop(source, target)其他鼠标操作汇总 鼠标单击操作 click() from selenium import webdriv…

python中的文件操作2

文件遍历 在Python中&#xff0c;遍历文件通常指的是逐行读取文件中的内容。这种方式对于处理大型文件特别有用&#xff0c;因为它不需要一次性将整个文件加载到内存中。下面是几种常见的遍历文件内容的方法&#xff1a; 1. 使用with语句和for循环 这是最推荐的方式&#xf…

“2024杭州智慧城市及安防展会”将于4月在杭州博览中心盛大召开

2024杭州国际智慧城市及安防展览会&#xff0c;将于4月24日在杭州国际博览中心盛大开幕。这场备受瞩目的盛会&#xff0c;不仅汇集了全球智慧城市与安防领域的顶尖企业&#xff0c;更是展示最新技术、交流创新理念的重要平台。近日&#xff0c;从组委会传来消息&#xff0c;展会…

独孤思维:买了台一千块钱的电脑干副业

01 如何让自己集中精力做一件事情&#xff1f; 之前有个圈内大佬&#xff0c;为了写作集中精力&#xff0c;硬生生买了一个一千多的电脑。 这个电脑能干嘛&#xff1f; 只能写作&#xff0c;打字&#xff0c;连视频都卡&#xff0c;游戏就更不可能了。 为的是&#xff0c;…

【网站项目】089理发店会员管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

设计模式之模版方法实践

模版方法实践案例 实践之前还是先了解一下模版方法的定义 定义 模板方法模式是一种行为设计模式&#xff0c;它定义了一个骨架&#xff0c;并允许子类在不改变结构的情况下重写的特定步骤。模板方法模式通过在父类中定义一个模板方法&#xff0c;其中包含了主要步骤&#xf…

上海亚商投顾:沪指缩量调整 机器人概念股午后大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日缩量震荡&#xff0c;创业板指午后涨超1%&#xff0c;随后上演冲高回落走势。风电、光伏等新能源方向…