【动态规划】03斐波那契数列模型_最小花费爬楼梯_C++(easy2)

题目链接:leetcode最小花费爬楼梯


目录

题目解析:

算法原理

1.状态表示

2.状态转移方程

3.初始化

4.填表顺序

5.返回值

编写代码


题目解析:

 题目让我们求达到楼梯顶部的最低花费.

由题可得:

 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用(每一阶所需的费用由cost[ ]里的值决定)。

可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯,支付费用后,可选择向上爬一个或者两个台阶

那么楼顶在哪?

我们从题目里的实例一来分析:

如果楼顶是i,那么这里的最小花费为应该为10,但是这里输出是15

所以楼顶是在这里:


算法原理:

1.状态表示

先创建一个dp表

首先先思考dp表里面的值所表示的含义(是什么?)

dp[i]表示从i位置到终点的最小花费

这种状态表示怎么来的?

1.经验+题目要求

用之前或者之后的状态,推导出dp[i][j]的值;

根据最近的最近的一步,来划分问题

经验:以i位置为起点

题目让我们求达到楼梯顶部的最低花费

那么这里我们可以dp[i]来表示。

2.状态转移方程

dp[i]等于什么?

这里我们分两种情况:

第一种情况:

花费i位置(cost[i])后跳一步到i+1位置,再算i+1到楼顶的值;

这里的“算i+1到楼顶的值”就是我们的状态表示,所以这里可以用dp[i+1]来表示;

第二种情况:

花费i位置(cost[i])后跳一步到i+2位置,再算i+2到楼顶的值;

这里的“算i+2到楼顶的值”就是我们的状态表示,所以这里可以用dp[i+2]来表示;

总结一下两种情况:

因为我们这里求的是到达楼顶的最小花费,

所以要取这两个情况的最小值:

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

3.初始化

(保证填表的时候不越界)

我们在到达[n-1]与[n-2]时,

达到楼梯顶部的最低花费:

dp[n-1]=cost[n-1];

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

4.填表顺序

(为了填写当前状态的时候,所需要的状态已经计算过了)

这里所需要的状态是:dp[i+1],dp[i+2]

是从右往左推的

所以这里填表顺序是从右往左;

5.返回值

(根据题目要求和状态表示)

综上分析:

返回值为:min(dp[0],dp[1]);


编写代码:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
    //1.创建dp表
    //2.初始化
    //3.填表
    //4.返回结果

        int n=cost.size();
        vector<int> dp(n);
        dp[n-1]=cost[n-1];
        dp[n-2]=cost[n-2];
        for(int i=n-3;i>=0;i--)
        {
            dp[i]=min(dp[i+1],dp[i+2])+cost[i];

        }
        return min(dp[0],dp[1]);

    }
};

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃不胖的熊猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值