博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
力扣题解-746. 使用最小花费爬楼梯(动态规划)
阅读量:4299 次
发布时间:2019-05-27

本文共 2599 字,大约阅读时间需要 8 分钟。

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

数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost。

每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。

您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。

示例 1:

输入: cost = [10, 15, 20]

输出: 15
解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。
示例 2:

输入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]

输出: 6
解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。
注意:

cost 的长度将会在 [2, 1000]。

每一个 cost[i] 将会是一个Integer类型,范围为 [0, 999]。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解1

利用动态规划求解。

1. 状态定义

假设数组dp[i]表示爬到楼梯i时花费的体力值。

2. 状态转移方程

由于每次最多爬两级,因此dp[i]有两种方式到达:即从第i-1层楼梯,或从第i-2层楼梯, 则:

dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])i >= 2

3. 初始条件/边界

索引为 0 或 1 的元素作为初始阶梯时无需花费体力。

dp[0] = 0, dp[1] = 0

4. 最优解

到达楼顶为最终解dp[n]

代码1

class Solution {
public: int minCostClimbingStairs(vector
& cost) {
int n = cost.size(); vector
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[i-1]dp[i-2]有关,因此可用两个变量来缓存即可。

class Solution {
public: int minCostClimbingStairs(vector
& cost) {
int n = cost.size(); int dp_2 = 0; int dp_1 = 0; for (int i = 2; i <= n; i++) {
int dp = min(dp_1 + cost[i-1], dp_2 + cost[i-2]); dp_2 = dp_1; dp_1 = dp; } return dp_1; }};

题解2

利用动态规划求解。

1. 状态定义

假设数组dp[i]表示爬过楼梯 i 时花费的体力值,此时dp[i]包括爬楼梯i的体力花费。

2. 状态转移方程

由于每次最多爬两级,因此dp[i]有两种方式到达:即从第i-1层楼梯,或从第i-2层楼梯, 则:

dp[i] = cost[i] + min(dp[i-1], dp[i-2])i >= 2

3. 初始条件/边界

索引为 0 或 1 的元素作为初始阶梯时无需花费体力,但需要爬过楼梯0和1时就需要花费对应的体力值。

dp[0] = cost[0], dp[1] = cost[1]

4. 最优解

爬过楼梯n-1,或爬过楼梯n-2时可以直接到达楼顶,因此最终解表示为min(dp[n-1], dp[n-2])

代码2

class Solution {
public: int minCostClimbingStairs(vector
& cost) {
int n = cost.size(); vector
dp(n); dp[0] = cost[0]; dp[1] = cost[1]; for (int i = 2; i < n; i++) {
dp[i] = cost[i] + min(dp[i-1], dp[i-2]); } return min(dp[n-1], dp[n-2]); }};

空间复杂度改进2

由状态转移方程,当前状态只与前两个状态dp[i-1]dp[i-2]有关,因此可用两个变量来缓存即可。

class Solution {
public: int minCostClimbingStairs(vector
& cost) {
int n = cost.size(); int dp_2 = cost[0]; int dp_1 = cost[1]; for (int i = 2; i < n; i++) {
int dp = cost[i] + min(dp_1, dp_2); dp_2 = dp_1; dp_1 = dp; } return min(dp_1, dp_2); }};
你可能感兴趣的文章
设计模式19_状态
查看>>
设计模式20_观察者
查看>>
vnpy学习10_常见坑
查看>>
vnpy学习10_常见坑02
查看>>
用时三个月,终于把所有的Python库全部整理了!拿去别客气!
查看>>
pd.stats.ols.MovingOLS以及替代
查看>>
vnpy学习11_增加测试评估指标
查看>>
资金流入流出计算方法
查看>>
海龟交易法则07_如何衡量风险
查看>>
海龟交易法则08_风险与资金管理
查看>>
海龟交易法则09_海龟式积木
查看>>
海龟交易法则10_通用积木
查看>>
海龟交易法则14_掌控心魔
查看>>
海龟交易法则15_万事俱备
查看>>
海龟交易法则16_附原版海龟交易法则
查看>>
克罗谈投资策略01_期货交易中的墨菲法则
查看>>
克罗谈投资策略02_赢家和输家
查看>>
克罗谈投资策略03_你所期望的赌博方式
查看>>
克罗谈投资策略04_感觉与现实
查看>>
通向财务自由之路01_导读
查看>>