代码随想录算法训练营第三十八天| 动态规划,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

本文主要是介绍代码随想录算法训练营第三十八天| 动态规划,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

动态规划

题目链接: 509. 斐波那契数

思路

代码

题目链接: 70. 爬楼梯

思路

代码

题目链接: 746. 使用最小花费爬楼梯

思路

代码

总结


动态规划

        Dynamic programming,DP问题。某一问题包含很多重叠的子问题,每个状态都由上一个状态推导而来。问题包括:基础问题,背包问题,打家劫舍,股票问题,子序列问题,

        步骤:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

题目链接:509. 斐波那契数

思路

        题目给出了dp五部曲中的所有信息。

代码

class Solution {
public:int fib(int n) {if (n <= 1)return n;vector<int> dp(n + 1); // 定义dp数组,dp[i]就是斐波那契数列第i个的值dp[0] = 0;dp[1] = 1; // 按照斐波那契数列初始化前两个数for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2]; // 递推公式}return dp[n];}
};

题目链接:70. 爬楼梯

思路

        1阶有1中方法,2阶有两种方法,3阶则是可以从1阶或者2阶走上来,从1或者2走上来总共3种方法。递推下去,发现与斐波那契数列相同,只是该题的0阶并无含义。对求斐波那契数列的代码进行状态压缩,因为每次求值只跟前两个状态有关,因此只需要三个变量,而不是一个数组。

代码

class Solution {
public:int climbStairs(int n) {if (n <= 2)return n;int dp1 = 1; // 一阶台阶int dp2 = 2; // 二阶台阶int result = 0;for (int i = 3; i <= n; i++) {result = dp1 + dp2; // 递推公式dp1 = dp2;          // 更新dp2 = result;}return result;}
};

题目链接:746. 使用最小花费爬楼梯

思路

        使用最小消费爬楼梯

        1.dp[i]数组含义为到第i阶台阶所需要花费多少

        2.递推公式dp[i] = min(dp[i-1]+cost[i-1], [dp[i-2]+cost[i-2])

        3.根据题意和dp数组含义,可知在下标为0或1时不需要花费体力,因此dp[0]=0,dp[1]=0

        4.遍历顺序,从前向后

        5.如果有bug,打印dp数组debug

代码

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {vector<int> dp(cost.size() + 1); // 到第i阶的所有花费dp[0] = 0;                       // 0或1阶不需要花费dp[1] = 0;for (int i = 2; i <= cost.size(); i++) {// 递推公式,每次取最小花费dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[cost.size()]; // 返回最小花费}
};

总结

        ①动态规划的第一天,基础知识种的五部曲很重要

        ②今天的题都是入门题目,较为简单,但也是看视频讲解后做的

        ③还是不能依赖核心代码模式,一是在ACM模式下不知道怎么下手,二是不好debug

这篇关于代码随想录算法训练营第三十八天| 动态规划,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941207

相关文章

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹