题目
分析
本题也是爬楼梯的扩展,题意不明确。参考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 };