C语言入门算法——爬楼梯(了解动态规划)

题目描述:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45

题目来源:爬楼梯

思路及部分代码:

1. 分析

        通过题目我们可以了解到 f(n) 的方法是上一台阶 f(n-1) ——爬一阶台阶到达 f(n)  加上上两阶台阶到达 f(n) 。所以可得 f(n) = f(n - 1) + f(n-2);

2. dynamic() 直接递归(超时

        此函数重复计算,导致时间不够。


int dynamic(int n){if(n == 1) return 1;else if(n == 2) return 2;else{ //大于阶梯数//方法有 f(n) = f(n -1) + f(n - 2);return dynamic(n-1) + dynamic(n-2);}
}

3. dynamic_1(); 从1到n(通过

        通过从1计算到n并保存之前的f(n-1) 和f(n-2)


int dynamic_1(int i, int a1, int a2,int n){if(i == 1){a1 = 0;a2 = 1;}if(i >= n) return a1+a2;else return dynamic_1(i+1, a2, a1+a2,n);
}

4. dynamic_2();  数组 (通过

        在了解动态规划时,看见要用数组,就想到了这样,显示这种和dynamic_1();的方法一样,只是将a1,a2;改成了数组而已。(不是动态规划)


int num[3] = {0,0,0};
int dynamic_2(int i, int n){//更新数据if(i == 1){num[0] = 0;num[1] = 1;num[2] = num[0] + num[1];}else{num[0] = num[1];num[1] = num[2];num[2] = num[0] + num[1];}if(i >= n) return num[2];else return dynamic_2(i+1,n);
}

5. dynamic_3();  动态规划 (通过

        动态规划算法:(百度)核心思想是将问题分解为若干个子问题,并保存这些子问题的解,以便在解决原始问题时可以重复使用,避免重复计算,从而提高算法的效率。动态规划特别适用于那些具有“最优子结构和重叠子问题”特性的问题,在动态规划中,原问题被分解为相对简单的子问题,这些子问题按顺序求解,并通过保存它们的解来避免重复计算,最终通过组合这些子问题的解来得到原问题的解。

        理解:1. 减少重复计算        2.用小问题叠加解决大问题


//动态规划
int dynamic_3(int n){int dp[n+1];dp[0] = 1;dp[1] = 1;for(int i = 2; i<n+1;i++){dp[i] = dp[i-1] + dp[i-2];}return dp[n];
}

总代码:


int dynamic(int n){if(n == 1) return 1;else if(n == 2) return 2;else{ //大于阶梯数//方法有 f(n) = f(n -1) + f(n - 2);return dynamic(n-1) + dynamic(n-2);}
}int dynamic_1(int i, int a1, int a2,int n){if(i == 1){a1 = 0;a2 = 1;}if(i >= n) return a1+a2;else return dynamic_1(i+1, a2, a1+a2,n);
}int num[3] = {0,0,0};
int dynamic_2(int i, int n){//更新数据if(i == 1){num[0] = 0;num[1] = 1;num[2] = num[0] + num[1];}else{num[0] = num[1];num[1] = num[2];num[2] = num[0] + num[1];}if(i >= n) return num[2];else return dynamic_2(i+1,n);
}//动态规划
int dynamic_3(int n){int dp[n+1];dp[0] = 1;dp[1] = 1;for(int i = 2; i<n+1;i++){dp[i] = dp[i-1] + dp[i-2];}return dp[n];
}int climbStairs(int n) {//return dynamic(n);//return dynamic_1(1,0,0,n);//return dynamic_2(1,n);return dynamic_3(n);
}

总结:

        了解动态规划,减小运行时间,在题目越来越难的情况下,原本的暴力手段已经不足以解决问题,只有通过学习不同的算法才能完成更高难度的题目,以下是本次总结。

不足之处:

  1. 递归方法 (dynamic 和 dynamic_1):

    • 使用递归方式解决问题,但存在效率问题,特别是对于较大的输入值。
    • 在 dynamic_1 中,变量传递方式可能不够清晰。
  2. 递归方法使用全局变量 (dynamic_2):

    • 使用全局变量 num 来存储中间结果,避免了重复计算。
    • 全局变量的使用增加了代码的复杂性和维护难度。
  3. 动态规划方法 (dynamic_3):

    • 使用动态规划来解决问题,避免了递归中的重复计算问题。
    • 效率较高,适用于大规模问题的解决。

改进建议:

  1. 优化效率:

    • 对于递归方法,考虑使用记忆化搜索来避免重复计算,提高效率。
  2. 改进代码结构:

    • 改进变量传递方式,使代码更清晰易懂。
    • 避免使用全局变量,可以通过参数传递或者结构体来管理状态。
  3. 代码质量提升:

    • 添加适当的注释和更具描述性的命名,以提高代码的可读性。
    • 实现错误处理机制,确保代码的健壮性和稳定性。

参考资料:

看一遍就理解:动态规划详解

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

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

相关文章

java锁面试题

这里写目录标题 1.悲观锁和乐观锁2.悲观锁和乐观锁的场景3.自旋锁和自适应自旋锁4.无锁、偏向锁、轻量级锁、重量级锁5.公平锁和非公平锁6.可重入锁7.排他锁和共享锁8.锁优化技术 1.悲观锁和乐观锁 悲观锁&#xff1a;在修改数据时&#xff0c;一定有别的线程来使用&#xff0…

代码随想录算法训练营第三十二天| LeetCode122.买卖股票的最佳时机II、LeetCode55.跳跃游戏、LeetCode45.跳跃游戏II

LeetCode 122 买卖股票的最佳时机II 题目链接&#xff1a;122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 【解题思路】 利润当天成交价-昨天成交价 当遇到利润为正数的情况&#xff0c;将其收集。 【解题步骤】 1.定义一个result&#xff0c;将每天…

如何使用ArcGIS Pro进行路径分析

路径分析是一种空间分析技术&#xff0c;用于确定两个或多个地点之间最佳路径或最短路径&#xff0c;这里为大家介绍一下在ArcGIS Pro中如何进行路径分析&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的道路数据&#xff0c;除了道路数据&a…

阿里TTl使用管理日志

在管理日志的时候我们需要查看生成日志都是那些人干了那些事&#xff0c;那么怎么在日志上查看这些事情呢&#xff0c;首先呢可以直接使用Slf4j,然后再配置文件里配置一下 #日志文件最大上限 logging.file.max-size100MB #日志文件存储位置 logging.file.path./logs #日志文件…

中颖51芯片学习7. ADC模数转换

中颖51芯片学习7. ADC模数转换 一、ADC工作原理简介1. 概念2. ADC实现方式3. 基准电压 二、中颖芯片ADC功能介绍1. 中颖芯片ADC特性2. ADC触发源&#xff08;1&#xff09;**软件触发**&#xff08;2&#xff09;**TIMER4定时器触发**&#xff08;3&#xff09;**外部中断2触发…

面试: 悲观锁和乐观锁

一、悲观锁的代表是synchronized和Lock 锁 其核心思想是【线程只有占有了锁&#xff0c;才能去操作共享变量&#xff0c;每次只有一个线程占锁成功&#xff0c;获取锁失败的线程&#xff0c;都得停下来等待】线程从运行到阻塞、再从阻塞到唤醒&#xff0c;涉及线程上下文切换&a…

【设计模式】装饰模式

目录 什么是装饰模式 代码实现 什么是装饰模式 Java装饰模式是一种结构型设计模式&#xff0c;它允许你动态地将新功能附加到对象上&#xff0c;通过将对象包装在一个装饰器对象中。这种模式能够在不修改现有对象结构的情况下&#xff0c;灵活地添加功能。 在Java中&#xf…

vue ---列表渲染

1.基本列表 v-for指令: 用于展示列表数据语法&#xff1a;v-for“(item, index) in xxx” :key“yyy”.可遍历&#xff1a;数组、对象、字符串&#xff08;用的很少&#xff09;、指定次数&#xff08;用的很少&#xff09; <!DOCTYPE html> <html><head>&l…

CTFHub(web sql注入)(三)

MYSQL 手工注入 1.判断字段数 输入1 输入2 输入3 得知字段有两个 2.判断注入类型 1 and 1 1 1 and 12 回显错误&#xff0c;说明存在sql注入 3.查看数据库内容 知道字段数量为2后&#xff0c;可以查看数据库位置 1 union select 1,2 使用union select 1,2查看未发现数…

【Java基础】21.重写(Override)与重载(Overload)

文章目录 一、重写(Override)1.方法重写2.方法的重写规则3.Super 关键字的使用 二、重载(Overload)1.方法重载2.重载规则3.实例 三、重写与重载之间的区别 一、重写(Override) 1.方法重写 重写&#xff08;Override&#xff09;是指子类定义了一个与其父类中具有相同名称、参…

阿里云OSS 存储对象的注册与使用

目录 一、什么是阿里云OSS 二、 点击免费试用 2.1 选择第一个&#xff0c;点击免费试用 ​编辑 2.2 登录管理控制台 2.3 进入Bucket 2.4、在阿里云网站上的个人中心配置Accesskey,查询accessKeyId和accessKeySecret。 2.5、进入AccssKey管理页面应该会出现下图提示&…

连接共享打印机提示0x00000011b

步骤一&#xff1a;调出运行窗口&#xff0c;输入【regedit】调出注册表编辑器。步骤二&#xff1a;找到以下路径&#xff1a;【计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print】。步骤三&#xff1a;鼠标右击——点击【新建】——选择【DWORD (32位&#…

基于TypeScript自定义Strapi users-permissions插件接口

Strapi的官方文档提供了扩展插件的方式&#xff0c;例如在src/extensions/users-permissions/strapi-server.ts中自定义&#xff0c;但文档提供的例子直接重写了原有插件的函数&#xff0c;而无法通过类似自定义API调用super.find()等方式调用原有插件的函数。 // 自定义API的…

Webservice使用教程

Webservice使用教程&#xff08;jax-ws&#xff09; Webservice的交互模式是一个类似于CS结构的模式&#xff0c;因此它需要一个Server端与一个Client端。在Client端访问Server端的接口来实现Webservice的功能。 Server端 打开IDEA创建gradle模块 webservice-01-server1 然后…

【VI/VIM】基本操作备忘录

简介 新建/打开文件 工作模式 常用命令 移动命令 文本选中 撤销、删除 复制粘贴 替换 缩排 查找 替换 插入 分屏 练习

【动态规划】C++简单多状态dp问题(打家劫舍、粉刷房子、买卖股票的最佳时机...)

文章目录 前言1. 前言 - 理解动态规划算法2. 关于 简单多状态的dp问题2.5 例题按摩师/打家劫舍 3. 算法题3.1_打家劫舍II3.2_删除并获得点数3.3_粉刷房子3.4_买卖股票的最佳时机含冷冻期3.5_买卖股票的最佳时机含手续费3.6_买卖股票的最佳时机III3.7_买卖股票的最佳时机IV 前言…

AcWing 800. 数组元素的目标和——算法基础课题解

AcWing 800. 数组元素的目标和 题目描述 给定两个升序排序的有序数组 A 和 B&#xff0c;以及一个目标值 x。 数组下标从 0 开始。 请你求出满足 A[i]B[j]x 的数对 (i,j)。 数据保证有唯一解。 输入格式 第一行包含三个整数 n,m,x&#xff0c;分别表示 A 的长度&#xf…

C# 语法全解总目录

C# 语法全解总目录 简介正文C#各大版本特性C# 语言类型C# 面向对象编程(一) 类相关(二) 继承 C#进阶(一) 委托(二) 事件(三) 元组(四) XML相关(五) 动态绑定 简介 记录C# 专栏所有文章的路径 正文 C#各大版本特性 C#各大版本特性 C# 语言类型 系列链接 C#语法系列:C# 语言类…

交换机的种类有哪些?主要都具有哪些作用?

在当今数字化时代&#xff0c;网络已经成为我们生活和工作中不可或缺的一部分。无论是家庭网络还是企业网络&#xff0c;都需要有效的网络设备来实现数据通信和资源共享。而网络交换机作为一种重要的网络设备&#xff0c;扮演着连接和管理网络设备的关键角色。本文将探讨交换机…

开源贡献代码之​探索一下CPython

探索一下Cython 本篇文章将会围绕最近给Apache提的一个feature为背景&#xff0c;展开讲讲CPython遇到的问题&#xff0c;以及尝试自己从0写一个库出来&#xff0c;代码也已经放星球了&#xff0c;感兴趣的同学可以去下载学习。 0.背景 最近在给apache arrow提的一个feature因为…