• 746. 使用最小花费爬楼梯


    题目描述

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

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

    您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 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。

    注意:

    1. cost 的长度将会在 [2, 1000]。
    2. 每一个 cost[i] 将会是一个Integer类型,范围为 [0, 999]。

    算法

    这是动态规划的题目,比较简单的一类,以经验来看,状态转移方程应为一维。

     目标求到达楼层顶部的最小花费。所谓楼层顶部,比如示例1的cost = [10,15,20],那么楼层顶部在位置cost[2] = 20的后面,就是说走完所有的阶梯0,1,2就能到达楼层顶部了,最后人停在cost[2]的后面。

     开一个数组dp作为状态转移方程,dp[i]代表到达第i个阶梯所需要的最小花费,所以dp数组的大小应该为cost的大小+1,dp[cost.size()]代表到达楼层顶部所需要的最小花费。因此,需要在cost后面也插入一个花费0.

    边界条件

    1. cost的大小为1
    2. cost的大小为2

    状态转移方程

     由于每一次可以走1个楼梯或者两个楼梯,所以第i个阶梯的最小花费应该和第i-1和第i-2个阶梯的最小花费有关,为它们两个的最小值与第i个阶梯的花费之和

    代码

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    
    class Solution {
    public:
        int minCostClimbingStairs(vector<int>& cost) {
            int size = cost.size();
            if(size == 1)
                return cost[0];
            
            if(size == 2)
                return min(cost[0], cost[1]);
            // dp[i]代表到达第i和阶梯所需要的最小花费
            int dp[size+1];
            cost.push_back(0);
            dp[0] = cost[0];
            dp[1] = cost[1];
            for(int i = 2; i <= size; i++)
            {
                dp[i] = min(dp[i-2], dp[i-1]) + cost[i];
            }
            return dp[size];
        }
    };
    
    int main()
    {
        Solution s;
        vector<int> cost = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
        cout << s.minCostClimbingStairs(cost) << endl;
        return 0;
    }
    
  • 相关阅读:
    【SVN解决代码提交冲突】https://www.cnblogs.com/aaronLinux/p/5521844.html
    查询有2门及以上不及格科目的学生姓名及其平均成绩
    【Python】split
    【Python】文件处理
    【robotframework】打开浏览器提示:NoSuchWindowException: Message: Unable to get browser
    定位到新窗口
    8月1号
    【定位】https://blog.csdn.net/cyjs1988/article/details/76284289
    【Robotframework】脚本跑完后自动发送邮件
    jQuery Mobile Data 属性
  • 原文地址:https://www.cnblogs.com/shayue/p/10352934.html
Copyright © 2020-2023  润新知