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 };
  • 相关阅读:
    idea用法
    pagehelper用法
    mybatis
    多线程2
    radio 标签状态改变时 触发事件
    多线程
    a标签点击后,给a标签添加样式
    servlet
    mybatis 查询
    springmvc 发送PUT 和 DELETE 请求
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/14380002.html
Copyright © 2011-2022 走看看