0
点赞
收藏
分享

微信扫一扫

【leetcode】使用最小花费爬楼梯 c++

题目描述:

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

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

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

示例 1:

示例2:

提示:

代码:

class Solution {
    public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n=cost.size();
        int dp[n+1];
        if(n==0)return 0;
        if(n==1)return cost[0];
        memset(dp,0,sizeof(dp));
        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];
    }
};

典型的动态规划,写出状态转移方程dp[i]表示到达第i层所需要的最小花费到达第i层有两种方法:从(i-1)层上一层到第i层,或从第(i-2)层上两层到达第i层,第i层的最小花费选取两种方案中的最小值,即:

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

观察示例1:从第0层开始到达顶楼的花费为cost[0]=10,从第1层开始到达顶楼的花费为cost[1]=15,但输出结果为15,说明到达顶楼不是指到达第n-1层。若考虑到达顶楼是指到达第n层,则从第0层到达第n层花费为cost[0] + cost[2] = 10 + 20 = 30,从第1层到达第n层花费为cost[1] = 15 < 30,与示例输出相同。

所以题目到达顶楼的意思为到达第n层而非第n-1层
在这里插入图片描述
注意:

题目用非逻辑形式表达的定义可能表意不清,需要用示例判断具体的定义

举报

相关推荐

0 条评论