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 };

 

posted @ 2021-02-05 22:21  Uitachi  阅读(65)  评论(0编辑  收藏  举报