leetcode746.使用最小花费爬楼梯(动态规划)

ops/2024/9/24 16:30:34/

问题描述:

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例一:
 

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 

示例二:

输入: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 。

问题解决:

方法一:

1.状态表示:

因为要使用动态规划来解决,所以必须要有dp数组来记录一个状态。

这道题中dp[i]表示到达i位置的最小花费,下面就要用前面的dp值以及cost值来表示dp[i]

2.状态转移方程

主要是通过之前的状态,来表示dp[i]的值。

因为题干中规定可以选择向上爬一个台阶或者两个台阶,对应dp[i]就要找出这两种情况下花费最小

的从而赋值给dp[i]。

dp[i]可以选择前一个台阶即[i - 1]的位置然后向上走一步,这时的花费为dp[i - 1] + cost[i - 1],对应的

为走一步的情况。

dp[i]可以选择前两个台阶即[i - 2]的位置然后向前走两步,这是的花费位dp[i - 2] + cost[i - 2],对应为

向前走两步的情况。

所以dp[i]的状态转移方程为:min(dp[i - 1] + cost[i - 1] , dp[i - 2] + cost[i - 2]).

3.初始化一些值

这一步主要是为了在填写dp表的时候不越界。

从状态转移方程中我们可以看到,使用了dp[i - 1]和dp[i - 2]这两个值,这也就意味着

我们需要初始化dp[0]和dp[1]这两个位置,那么应该初始化成什么呢?

因为题干中说可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯,所以这也就代表了前往第0个梯

子和第一个梯子不需要任何花费,所以初始化:

dp[0] = dp[i] = 0;

4.填表的顺序

应为dp[i]的实现依靠于dp[i - 1]和dp[i - 2]所以也就注定了顺序是从左向右的。

5.返回值

题干要求返回到达楼顶的最高位置,所以直接返回最高位置的dp数组的值就可以了。

细节:

到底哪里才算爬到楼顶,应该是将最后一个阶梯走完之后,才算爬到楼顶,所以也就注定了dp数组

的长度比cost数组的长度要多一位,用来记录最后到楼顶的花费。

对应的代码:

int minCostClimbingStairs(vector<int>& cost) 
{// dp[i] 表示到达i位置的最小花费int n = cost.size();vector<int> dp(n + 1);dp[0] = 0;dp[1] = 0;for (int i = 2; i <= n; i++) {dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[n];
}

动态规划的代码的书写方式很固定,首先判断是否有特殊情况,有的话直接先进行判断,然后

1.创建dp表

2.初始化dp中的一些元素

3.顺序填表(状态转移方程)

4.返回 

方法二:

1.状态表示:

因为要使用动态规划来解决,所以必须要有dp数组来记录一个状态。

这道题中dp[i]表示从i位置出发,到达楼顶的最小花费

2.状态转移方程

主要是通过之后的状态,来表示dp[i]的值。

这里的dp[i]有了不同的含义,因为题干中规定可以向前走一步或者两步,所以可以选择后一个或者

后两个来取出最小的花费

dp[i]如果选择后一个台阶来进行跳跃,就需要从后一个位置出发,到达楼顶的最小花费来加上自己

位置本身的花费来表示dp[i]的值。

dp[i]如果选择后两个台阶来进行跳跃,就需要从后两个位置出发,到达楼顶的最小花费来加上自己

位置本身的画法来表示dp[i]的值。

所以dp[i]的状态转移方程是:dp[i] = min(dp[i + 1] + cost[i], dp[i + 2] + cost[i]).

3.初始化一些值

这一步主要是为了在填写dp表的时候不越界。

观察状态转移方程发现需要dp的后两个位置的值,这也就意味着我们要初始化

dp[n - 1]和dp[n - 2]这两个值,那么这两个值应该初始化成什么呢?

由题干可知:可选择向上爬一个或者两个台阶,所以只要这两个台阶的人支付自己所在的台阶的费

用,就可以实现到达顶端。

对dp[n - 1]和dp[n - 2]的初始化为:

dp[n - 1] = cost[n - 1],dp[n - 2] = cost[n - 2].

4.填表的顺序

可以从状态转移方程看出,填表顺序是从右到左的

5.返回值

应为题干规定可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯

所以dp[0]和dp[1]都有可能是最终的答案,谁小取谁

min(dp[0],dp[]1)

最终的代码如下:

class Solution 
{
public:int minCostClimbingStairs(vector<int>& cost) {// dp[i]表示从i位置出发,到达楼顶的最小花费//1.创建dp表int n = cost.size();vector<int> dp(n);//2.初始化dp中的一些元素dp[n - 1] = cost[n - 1];dp[n - 2] = cost[n - 2];//3.顺序填表(状态转移方程)for (int i = n - 3; i >= 0; i--) {dp[i] = min(dp[i + 1] + cost[i], dp[i + 2] + cost[i]);}//4.返回return min(dp[0], dp[1]);}
};

 这就是这道题的两种解法。


http://www.ppmy.cn/ops/38404.html

相关文章

实用的Chrome命令

以下是一些实用的Chrome命令及其用途&#xff1a; --allow-outdated-plugins&#xff1a;允许浏览器使用过期的插件&#xff0c;这在开发过程中可能会用到&#xff0c;以便测试兼容性。chrome://downloads&#xff1a;打开Chrome的下载页面&#xff0c;查看和管理你的下载文件…

《21天学通C++》(第十四章) 宏和模板介绍(2)

相较于宏&#xff0c;C更推荐使用模板编程&#xff0c;因为它们提供了更好的类型安全、更清晰的语法和更易于调试的代码 1.模板函数 语法 template <typename T> void function(T param) {// 函数体&#xff0c;使用T作为类型参数 }例子 #include <iostream> us…

【通信】为什么用复形式表示信号

引入&#xff1a; 一个实例反映复信号和实信号对应关系&#xff08;幅度与相位&#xff09; 复信号的意义 在实际工程中&#xff0c;没有数学意义上的复数信号。再信号与系统中引入复数是为了&#xff1a; ①简化公式&#xff0c;特别是三角函数 ②复数的实部和虚部实际上代…

Capl复合数据类型:数组

数组 数据是一组具有相同数据类型的数据集合。 数组声明时&#xff0c;如果不赋值&#xff0c;默认所有元素都赋值为0. 数组声明赋值时&#xff0c;如果赋值的元素超过数组设置的大小&#xff0c;就会报错&#xff0c;触发数组索引越界。如果赋值的元素没有超过数组设置的大…

C++实验五 : 类的继承 -----CUST

【题目】 1.定义person类&#xff0c;包括数据私有成员&#xff1a;姓名&#xff0c;性别&#xff1b;共用成员函数&#xff1a;带参数构造函数&#xff0c;display函数输出本类对象的所有数据成员值。 2.定义student类&#xff0c;保护继承person类&#xff1b;增加保护数据成…

Linux-笔记 开发板修改用户相关信息

1. 添加新用户 在root用户下执行adduser username添加新用户&#xff1a; mkdir /home adduser -h /home/embedsky embedsky # -h 指定用户目录路径 修改新用户的su权限&#xff1a; chmod us /bin/su 2. 修改用户密码 在root用户下执行passwd username修改用户密码&…

建议这些企业都搭建在线自动问答AI机器人

越来越多的企业开始认识到在线自动问答AI机器人的重要性&#xff0c;甚至有的企业开始在琢磨如何搭建一个在线自动问答ai机器人。在线自动问答ai机器人可以有效提升客户服务的效率&#xff0c;还能降低企业的运营成本提高用户体验感。本文将探讨建议什么样的企业搭建在线自动问…

智能BI(后端) -- 智能分析业务

文章目录 业务流程开发接口easyExcel从excel读取数据&#xff0c;数据过滤并进行数据压缩分析接口利用AI生成结论和图表AI提问技巧调用AI直接调用AI大模型官网的接口使用云服务商提供的&#xff0c;封装后的AI接口利用鱼聪明AI提供的开放SDK 智能接口实现 业务流程 用户输入 …