一文搞懂从爬楼梯到最小花费(力扣70,746)


文章目录

  • 题目
  • 前知
    • 动态规划简介
    • 动态规划模版
  • 爬楼梯
    • 一、思路
    • 二、解题方法
    • 三、Code
  • 使用最小花费爬楼梯
    • 一、思路
    • 二、解题方法
    • 三、Code
  • 总结


在计算机科学中,动态规划是一种强大的算法范例,用于解决多种优化问题。本文将介绍动态规划的核心思想,并通过两个经典的力扣题目展示其应用:爬楼梯(LeetCode 70)和使用最小花费爬楼梯(LeetCode 746)

题目

Problem: 70. 爬楼梯
Problem: 746. 使用最小花费爬楼梯

爬楼梯
假设你正在爬楼梯。需要 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 阶

使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。

示例 1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。

  • 支付 15 ,向上爬两个台阶,到达楼梯顶部。
    总花费为 15 。

示例 2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。

  • 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
  • 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
  • 支付 1 ,向上爬一个台阶,到达楼梯顶部。
    总花费为 6 。

前知

动态规划简介

动态规划算法(Dynamic Programming)是一种解决多阶段决策过程最优化问题的方法。它将问题分解为相互重叠的子问题,并通过解决子问题来解决整个问题。这种方法通常用于具有重叠子问题和最优子结构性质的问题。

动态规划的基本思想是将原问题分解为相互重叠的子问题,并在解决这些子问题时进行存储,以避免重复计算。通过这种方式,可以大大减少计算量,提高算法效率。动态规划算法通常涉及两个关键步骤:定义状态和状态转移方程。

  • 定义状态: 确定问题中的状态变量,并定义状态之间的关系。状态变量描述问题的当前情况,是动态规划算法的关键。

  • 状态转移方程: 建立状态之间的转移关系,描述如何从一个状态转移到另一个状态。这个方程描述了问题的最优子结构,是动态规划算法的核心。

动态规划算法通常用于解决一些优化问题,例如最长公共子序列、最短路径、背包问题等。在实际应用中,动态规划常常能够以较高效率解决一些复杂的问题,但需要注意的是,有时需要权衡时间和空间复杂度。

与贪心算法的区别:

  1. 最优子结构性质:
  • 动态规划: 动态规划问题具有最优子结构性质,即问题的最优解可以通过子问题的最优解来构造。在解决动态规划问题时,通常需要考虑所有可能的子问题,并选择其中最优的解进行组合。
  • 贪心算法: 贪心算法也寻求问题的最优解,但它通常通过在每个步骤中选择当前状态下的局部最优解来构造全局最优解。贪心算法没有最优子结构性质,它只关注当前状态下的最优选择,而不考虑后续状态的影响。
  1. 状态的存储与重复计算:
  • 动态规划: 动态规划算法通常利用存储来避免重复计算子问题,因此可以在解决问题时节省计算时间。通过记忆化搜索或者建立动态规划表格,可以将子问题的解存储起来,以便后续使用。
  • 贪心算法: 贪心算法通常不需要存储中间状态或者解决方案,因为它只关注当前状态下的最优选择。这意味着贪心算法通常需要更少的存储空间。
  1. 适用范围:
  • 动态规划: 动态规划通常适用于具有重叠子问题和最优子结构性质的问题,例如最长公共子序列、最短路径、背包问题等。这些问题通常需要考虑多阶段决策过程,而动态规划能够有效地处理这种情况。
  • 贪心算法: 贪心算法通常适用于具有贪心选择性质的问题,即每个步骤都可以做出局部最优选择,并且这些局部最优选择能够导致全局最优解。贪心算法通常更简单、更高效,但只适用于部分问题,因为它没有考虑全局的影响。

动态规划模版

与之前讲的递归三部曲还有回溯三部曲都是类似的

动规五部曲:在这里面dp数组是非常重要的,一定要搞清楚dp数组的含义究竟是什么含义

在这里插入图片描述

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

爬楼梯

一、思路

第二层可以由第一层爬一个楼梯上来或者由第零层爬两个楼梯上来,二层以上都可以这样推出来,于是只要求出第零层和第一层的上楼方法就可以了

二、解题方法

动规五部曲

  1. 确定dp数组及下标i的含义:到达i层有dp[i]种不同的方法

  2. 确定递推公式:dp[i] = dp[i-1] + dp[i-2],第2层由第零层dp[0]或第一层dp[1]下一步得出,在推导dp[i]的时候,一定要时刻想着dp[i]的定义,否则容易跑偏。这体现出确定dp数组以及下标的含义的重要性!

  3. dp数组如何初始化:两层之后都可以由dp[0]dp[1]得出

  4. 确定遍历顺序:从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的

  5. 举例推导dp数组:当n=5时dp数组应该是这样的:

在这里插入图片描述

三、Code

class Solution {public int climbStairs(int n) {int[] dp =new int[n+1];dp[0] = 1;dp[1] = 1;for(int i=2;i<=n;i++){dp[i] = dp[i-1] + dp[i-2];}return dp[n];}
}

使用最小花费爬楼梯

一、思路

此题在上一题的基础上进行了爬楼梯需要耗费cost数组所需的体力,才能够向上爬,而站在起点0或起点1是不需要耗费体力的

二、解题方法

动规五部曲

  1. 确定dp数组及下标i的含义:到达第i个台阶所需要的最小花费dp[i]

  2. 确定递推公式:因为可以一次跳一个或两个台阶,所以dp[i]有两种方式得到,由dp[i-1]加上离开这层所需花费的cost[i-1]或者由dp[i-2]加上离开这层所需花费的cost[i-2],从两种情况中选最小的那个,所以要用Math.min(...,...)对两个结果进行比较得到dp[i]

  3. dp数组如何初始化:只需要初始化dp[0]dp[1]即可,其它dp都可以由这两个推出来,题目说可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯,所以dp[0]dp[1]都为0,不需要花费

  4. 确定遍历顺序:从前到后遍历cost数组

  5. 举例推导dp数组:用题目给的实例1进行举例,cost = [10,15,20],可以推出dp[0]=0,dp[1]=0,dp[2]=dp[0]+cost[0]=10,dp[3]=dp[1]+cost[1]=15。最后输出的确实是dp[3]=15。如下图所示:

image.png

三、Code

class Solution {public int minCostClimbingStairs(int[] cost) {// 到达第i层的最小花费dp[i]int[] dp = new int[cost.length + 1];dp[0] = 0;dp[1] = 0;// 最上面还有一层,台阶cost数组有三个,但是有四层楼梯for (int i = 2; i <= cost.length; i++) {dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[cost.length];}
}

总结

通过以上两个力扣题目的介绍,我们了解了动态规划算法在解决爬楼梯问题中的应用。动态规划算法不仅能够解决这类问题,还可以应用于更广泛的优化问题。希望本文能够帮助读者更好地理解和应用动态规划算法在爬楼梯问题中的使用,如果有任何疑问或者建议,欢迎留言讨论🌹

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

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

相关文章

主从复制、数据持久化 、Redis主从集群、哨兵机制 、Redis分片集群

数据持久化 Redis、主从集群、哨兵机制 Redis分片集群 1、单点 redis 的问题2、主从复制2.1 命令传播 3、Redis的持久化3.1 AOF3.2 RDB&#xff08;默认方式&#xff09;RDB 方式&#xff1a;执行快照时&#xff0c;数据能被修改吗&#xff1f;RDB 方式总结 3.3 RDB 和 AOF 组合…

电路基础-电容-电感

电路基础 电容 通交流阻直流&#xff0c;滤波&#xff0c;旁路&#xff0c;退耦&#xff0c;作驱动电源&#xff08;洗衣机电机启动时需要一个强电启动&#xff09; 电容选型的工程值&#xff1b;参考以往开发板的选型&#xff1b;抄作业。 电源并连多个电容的作用 保证单…

30万奖金谁能瓜分?OurBMC开源大赛决赛入围名单公示

首届开放原子开源大赛基础软件赛道自今年 1 月开启报名以来&#xff0c;吸引了全国各地 BMC 技术爱好者的广泛关注和踊跃报名。该赛事由开放原子开源基金会牵头&#xff0c; OurBMC 社区及理事长单位飞腾信息技术有限公司联合承办&#xff0c;以 “基于 BMC 技术的服务器故障诊…

go的orm框架-Gorm

官网文档 特点 全功能 ORM 关联 (拥有一个&#xff0c;拥有多个&#xff0c;属于&#xff0c;多对多&#xff0c;多态&#xff0c;单表继承) Create&#xff0c;Save&#xff0c;Update&#xff0c;Delete&#xff0c;Find 中钩子方法 支持 Preload、Joins 的预加载 事务&…

基于Vue3 中后台管理系统框架

基于Vue3 中后台管理系统框架 文章目录 基于Vue3 中后台管理系统框架一、特点二、源码下载地址 一款开箱即用的 Vue 中后台管理系统框架&#xff0c;支持多款 UI 组件库&#xff0c;兼容PC、移动端。vue-admin, vue-element-admin, vue后台, 后台系统, 后台框架, 管理后台, 管理…

Leetcode - 2009. 使数组连续的最少操作数

文章目录 解析排序 原地去重 滑动窗口AC CODE 题目链接&#xff1a;Leetcode - 2009. 使数组连续的最少操作数 解析 题中所述的连续数组就是一串连续的自然数&#xff0c;想问需要多少次操作能将原数组变为连续的数。 我们排序去重&#xff0c;用逆向思维想能保留的数字数目…

Qt | Q_PROPERTY属性和QVariant 类

一、属性基础 1、属性与数据成员相似,但是属性可使用 Qt 元对象系统的功能。他们的主要差别在于存取方式不相同,比如属性值通常使用读取函数(即函数名通常以 get 开始的函数)和设置函数(即函数名通常以 set 开始的函数)来存取其值,除此种方法外,Qt 还有其他方式存取属性值…

20240325-2-K-means面试题

K-means面试题 1. 聚类算法&#xff08;clustering Algorithms&#xff09;介绍 聚类是一种无监督学习—对大量未知标注的数据集&#xff0c;按数据的内在相似性将数据集划分为多个类别&#xff0c;使类别内的数据相似度较大而类别间的数据相似度较小。 聚类算法可以分为原型…

构建高效网络:深入理解正向与反向代理的作用与配置

正向代理 如果把局域网外的互联网环境想象成一个巨大的资源库&#xff0c;则局域网中的客户端要访问互联网则需要通过代理服务器来访问&#xff0c;这种代理成为正向代理。 示例&#xff1a; 用户想要访问 https://chensir.ink &#xff08;目标服务器&#xff09;&#xff0…

基于SSE长连接的智能客服问答系统技术方案及完整项目源码

文章目录 一、项目背景二、项目演示三、项目介绍B系统主要功能1. 注册登录重置密码2. 权限管理3. 项目管理4.客服管理 C系统主要功能1. 问答组件2. 主题色定制3. 类微信时间显示控件及智能tip提示4. 无障碍阅读4. 丰富的输入框组件5. 人工客服6. 聊天记录分表记录与查询 四、项…

Scala大数据开发

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Scala简述 在此&#xff0c;简要介绍 Scala 的基本信息和情况。 Scala释义 Scala 源自于英语单词scalable&#xff0c;表示可伸缩的、可扩展的含义。 Scala作者 Scala编…

K8s学习十(高级调度)

高级调度 CronJob计划任务 在 k8s 中周期性运行计划任务&#xff0c;与 linux 中的 crontab 相同注意点&#xff1a;CronJob 执行的时间是 controller-manager 的时间&#xff0c;所以一定要确保 controller-manager 时间是准确的cron表达式如下&#xff1a; 配置如下&#x…

Axios 使用教程

Axios 是什么? Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 特性 从浏览器创建 XM…

软件设计师——数据库

数据库 三级模式两级映像关系模型基本术语关系模型中的关系完整性约束 三级模式两级映像 概念模式&#xff08;也称模式&#xff09;对应基本表 外模式&#xff08;也称用户模式或子模式&#xff09;对应视图 内模式&#xff08;也称存储模式&#xff09;对应存储文件 两级映像…

Linux 5.10 Pstore 功能测试

目录 简介环境配置内核配置参考备注 简介 Pstore(Persistent store support)是用于系统发生oops或panic时&#xff0c;自动保存内核log buffer中的日志。随着功能不断完善&#xff0c;Duo S使用Linux 5.10已经支持保存console日志、ftrace消息和用户空间日志的收集&#xff0c…

Java基于SpringBoot+Vue的专家医院预约挂号系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Android Framework学习笔记(2)----系统启动

Android系统的启动流程 启动过程中&#xff0c;用户可控部分是framework的init流程。init是系统中的第一个进程&#xff0c;其它进程都是它的子进程。 启动逻辑源码参照&#xff1a;system/core/init/main.cpp 关键调用顺序&#xff1a;main->FirstStageMain->SetupSel…

顺序表(1)——顺序表详解

什么是数据结构&#xff1f; 简单来说数据结构就是计算机储存&#xff0c;组织数据的方式&#xff0c;而数组就是最基础的数据结构。 那为什么会有数据结构的存在呢&#xff1f; 这需要将数据结构分成数据和结构两部分进行分析。 数据&#xff1a;我们在计算机屏幕上所看见的文…

【LeetCode: 572. 另一棵树的子树 + 二叉树 + dfs】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

spring事务那些事

实际工作中还会面临千奇百怪的问题&#xff0c;看下面返个例子&#xff08;注意MySql数据库测试&#xff09;&#xff1a; //1.hello1Service 调用 hello2Service Transactional(propagation Propagation.REQUIRED,rollbackFor Exception.class) public void doUpdate() {//…