【Leetcode_easy】746. Min Cost Climbing Stairs
原创
©著作权归作者所有:来自51CTO博客作者mb62c788fd198da的原创作品,请联系作者获取转载授权,否则将追究法律责任
problem
746. Min Cost Climbing Stairs
题意:
solution1:动态规划;
定义一个一维的dp数组,其中dp[i]表示爬到第i层的最小cost,然后来想dp[i]如何推导。思考一下如何才能到第i层呢?是不是只有两种可能性,一个是从第i-2层上直接跳上来,一个是从第i-1层上跳上来。不会再有别的方法,所以dp[i]只和前两层有关系,所以可以写做如下:
dp[i] = min(dp[i- 2] + cost[i - 2], dp[i - 1] + cost[i - 1])
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
vector<int> dp(n+1, 0);
for(int i=2; i<=n; ++i)//errr..
{
dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);
}
return dp[n];
}
};
View Code
solution2:
要爬当前的台阶,肯定需要加上当前的cost[i],那么还是要从前一层或者前两层的台阶上跳上来,那么选择dp值小的那个,所以递归式如下:
dp[i] = cost[i] + min(dp[i- 1], dp[i - 2])
最后在最后两个dp值中选择一个较小的返回即可
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
vector<int> dp(n, 0);
dp[0] = cost[0], dp[1] = cost[1];
for(int i=2; i<n; ++i)//errr..
{
dp[i] = cost[i] + min(dp[i-1], dp[i-2]);
}
return min(dp[n-1], dp[n-2]);
}
};
参考
1. Leetcode_easy_746. Min Cost Climbing Stairs;
2. Grandyang;
完