一文搞懂从爬楼梯到最小花费(力扣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.rhkb.cn/news/301646.html

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

相关文章

CTK插件框架学习-服务工厂(06)

CTK插件框架学习-信号槽(05)https://mp.csdn.net/mp_blog/creation/editor/137240105 一、服务工厂定义 注册插件时使用服务工厂注册&#xff0c;使用getService根据调用者插件资源文件内容获取在服务工厂内的对应实现在服务工厂中可以知道是哪个插件正在调用服务工厂懒汉模式…

rabbitmq死信交换机,死信队列使用

背景 对于核心业务需要保证消息必须正常消费&#xff0c;就必须考虑消费失败的场景&#xff0c;rabbitmq提供了以下三种消费失败处理机制 直接reject&#xff0c;丢弃消息&#xff08;默认&#xff09;返回nack&#xff0c;消息重新入队列将失败消息投递到指定的交换机 对于核…

代码随想录第34天| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

1005.K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 贪心算法&#xff0c;这不就是常识&#xff1f;还能叫贪心&#xff1f;LeetCode&#xff1a;1005.K次取反后最大化的数组和_哔哩哔…

10.枚举

1.背景及定义 枚举是在JDK1.5以后引入的。 主要用途是&#xff1a; 将一组常量组织起来&#xff0c; 在这之前表示一组常量通常使用定义常量的方式&#xff1a; public static final int RED 1; public static final int GREEN 2; public static final int BLACK 3; 但是…

Web Component 组件库有什么优势

前言 前端目前比较主流的框架有 react&#xff0c;vuejs&#xff0c;angular 等。 我们通常去搭建组件库的时候都是基于某一种框架去搭建&#xff0c;比如 ant-design 是基于 react 搭建的UI组件库&#xff0c;而 element-plus 则是基于 vuejs 搭建的组件库。 可能你有这种体…

C语言进阶课程学习记录-第22课 - 条件编译使用分析

C语言进阶课程学习记录-第22课 - 条件编译使用分析 条件编译基本概念条件编译实验cmd命令窗口输入演示条件编译本质实验-ifdefcmd定义宏结果比较 include本质实验-间接包含同一个头文件解决重复包含的方法-ifndef实验-条件编译的应用小结 本文学习自狄泰软件学院 唐佐林老师的 …

线上研讨会 | 新一代数字化技术赋能机器人及智能产线行业高质量发展

随着智能制造的快速推进&#xff0c;制造业转型升级到了关键阶段。越来越多的企业以数字化技术搭配智能机器人及智慧产线&#xff0c;主动实现数字化转型。达索系统3D体验平台是实现企业数字化转型的新一代数智化平台&#xff0c;基于型、数字驱动、数字化连续技术&#xff0c;…

基于Socket简单的UDP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 网络编程前言 网络编程是连接数字世界的桥梁&#xff0c;它让计算机之间能够交流信息&#xff0c;为我们的生活和工作带来便利…

ICLR24_OUT-OF-DISTRIBUTION DETECTION WITH NEGATIVE PROMPTS

摘要 分布外检测&#xff08;OOD Detection&#xff09;的研究对于开放世界&#xff08;open-world&#xff09;学习非常重要。受大模型&#xff08;CLIP&#xff09;启发&#xff0c;部分工作匹配图像特征和提示来实现文本-图像特征之间的相似性。 现有工作难以处理具有与已…

牛顿:Archetype AI 的开创性模型,实时解读真实世界的新宠儿

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

免费云服务器汇总,最长永久免费使用

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始将业务迁移到云端。云服务器作为云计算的重要组成部分&#xff0c;以其灵活、高效、可扩展等特点受到广泛关注。然而&#xff0c;许多人在初次接触云服务器时&#xff0c;可能会对高昂的价格望而却步。为了帮助大…

VBA数据库解决方案第九讲:把数据库的内容在工作表中显示

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

【C++学习】哈希的应用—位图与布隆过滤器

目录 1.位图1.1位图的概念1.2位图的实现3.位图的应用 2.布隆过滤器2.1 布隆过滤器提出2.2布隆过滤器概念2.3如何选择哈希函数个数和布隆过滤器长度2.4布隆过滤器的实现2.4.1布隆过滤器插入操作2.4.2布隆过滤器查找操作2.4.3 布隆过滤器删除 2.5 布隆过滤器优点2.6布隆过滤器缺陷…

[BT]BUUCTF刷题第13天(4.1)

第13天 Upload-Labs-Linux (Basic) Pass-01 根据题目提示&#xff0c;该题为绕过js验证。 一句话木马&#xff1a; <?php eval(system($_POST["cmd"]));?> // 符号 表示后面的语句即使执行错误&#xff0c;也不报错。 // eval() 把括号内的字符串全部…

lottery-攻防世界

题目 flag在这里要用钱买&#xff0c;这是个赌博网站。注册个账号&#xff0c;然后输入七位数字&#xff0c;中奖会得到相应奖励。 githacker获取网站源码 &#xff0c;但是找到了flag文件但是没用。 bp 抓包发现api.php&#xff0c;并且出现我们的输入数字。 根据题目给的附…

未来的技术发展趋势

文章目录 前言一、人工智能技术势必聚焦安全能力二、单云环境逐渐让位于多云环境三、后量子密码或将在美大范围普及总结前言 2023 年,与网络空间安全息息相关的人工智能等技术发展迅猛,新的信息安全时代已然拉开大幕。在目睹了 ChatGPT、“星链”和量子通信等技术展现出的巨…

【C语言】函数相关选择题

前言 关于函数相关的选择题。 题目一&#xff1a; C语言规定&#xff0c;在一个源程序中&#xff0c;main函数的位置&#xff08; &#xff09; A .必须在最开始 B .必须在库函数的后面 C .可以任意 D .必须在最后 题解&#xff1a;选择C。 main函数为C语言中整个工程的程序入…

STL优先队列比较器

有两个比较器&#xff0c;在std里面&#xff0c;一个是greater&#xff0c;一个是less&#xff0c;他们都有一个可以指定的模板类型。 #include <bits/stdc.h> using namespace std; struct node {bool operator ()(const string& a, const string& b){return a…

Linux集群部署项目

目录 一&#xff0c;环境准备 1.1.安装MySQL 1.2.安装JDK 1.3.安装TomCat 1.4.安装Nginx 二&#xff0c;部署 2.1.后台服务部署 2.2.Nginx配置负载均衡及静态资源部署 一&#xff0c;环境准备 1.1.安装MySQL 将MySQL的安装包上传至服务器 查看系统中是否存在mariadb&…

X86汇编速成

平时用的电脑都是X86的&#xff0c;但是现在大家都在搞RISC-V&#xff0c;计组也都开始以RISC-V作为示例&#xff0c;所以专门回头来补一下X86的汇编&#xff0c;方便平时使用。 寄存器register X86_64中一共有16个64位的通用寄存器&#xff0c;分别为&#xff1a; RAX, RBX,…