zoukankan      html  css  js  c++  java
  • LeetCode746. 使用最小花费爬楼梯

    题目

    分析

    本题也是爬楼梯的扩展,题意不明确。参考LC评论区的解释后,豁然开朗。关键是对于cost代价值的理解,它代表的是从当前楼梯迈出所耗费的体力,而不是到达该层所需要的体力。可以翻译如下:

    在首尾都加一个0分别代表地面,和楼顶 数组的每一个数字代表从当前楼梯迈出所需要耗费的体力 从地面开始,第一步可以选择第0阶或者第1阶,都不费力 最终要求到达最后一个0(楼顶)所耗费的体力最少。

    每次爬1层或者两层,那么第 i 层的最低耗费应该与 i -1 层 和 i - 2层有关,此时不难推出状态转移方程:

    dp[i] = min(dp[i-1],dp[i-2]) + v[i],其中v[i]为 第 i 层的耗费

    代码

     1 class Solution {
     2 public:
     3     int minCostClimbingStairs(vector<int>& v) {
     4         if(v.size() == 2) return min(v[0],v[1]);
     5         
     6         //加入地面和楼顶,前面加0,后面加0
     7         v.insert(v.begin(),0);
     8         v.push_back(0);
     9         vector<int>dp(v.size());//dp[i]代表到达i层最小花费
    10         dp[0] = v[0];dp[1] = v[1];dp[2] = v[2];//开始可以选择原始0或1
    11         for(int i = 3;i < dp.size();i++){
    12             dp[i] = min(dp[i-1],dp[i-2]) + v[i];//每次爬1个或者两个
    13         }
    14         return dp[dp.size()-1];
    15     }
    16 };

    简化下

     1 class Solution {
     2 public:
     3     int minCostClimbingStairs(vector<int>& v) {
     4         vector<int>dp(v.size());
     5         dp[0] = v[0];dp[1] = v[1];
     6         for(int i = 2;i < dp.size();i++){
     7             dp[i] = min(dp[i-1],dp[i-2]) + v[i];
     8         }
     9         return min(dp[v.size()-1],dp[v.size()-2]); 
    10         //最后楼顶不需要花费所以查找倒数第一个和倒数第二个最小花费
    11     }
    12 };
  • 相关阅读:
    [php]php设计模式 Command(命令模式)
    [php]php设计模式 Observer(观察者模式)
    [转]Ubuntu 系统安装极点五笔
    [转] 关于开源协议
    上传大小限制设置
    php开启安全模式后禁用的函数
    [php]php设计模式 Template (模板模式)
    [php]php设计模式 Singleton(单例模式)
    [php]php设计模式 Strategy(策略模式)
    [转]调优您的 LAMP 应用程序的 5 种简单方法
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/14380002.html
Copyright © 2011-2022 走看看