70. 爬楼梯
算法思想
注意点和易错点
- dp数组怎么定义呢?是应该正着推还是反着推?
- 为什么爬楼梯dp[i] = dp[i-1] + dp[i-2],而不是dp[i-1] + dp[i-2] + 2?
- dp数组是n+1个,但是for循环里最大是n
代码
class Solution {
public:
int climbStairs(int n) {
if (n<=1) return n;
vector<int> dp(n+1);
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; ++i){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};
题号和链接
算法思想
注意点和易错点
代码
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size() + 1); // dp[i]的定义,到达第i个台阶最小的体力花费,为什么这里要+1?因为+1才是登顶了
dp[0] = 0;
dp[1] = 0;
for(int i = 2; i <= cost.size(); ++i){
dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
}
return dp[cost.size()];
}
};