题目链接:746. 使用最小花费爬楼梯
题目描述
解法一
dp[i]包含当前下标i阶梯的花费cost[i] ,楼梯顶部下标n的阶梯费用为0;
dp[0] = cost[0]; //初始化
dp[1] = cost[1];
dp[i] = min(dp[i-1]+cost[i], dp[i-2]+cost[i]); //递推公式
int n = cost.size()
dp[n] = 0+min(dp[n-1],dp[n-2])
代码
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
//dp[i] = cost[i]+min(dp[i-1],dp[i-2]);到达第i层最低花费;
//到达楼顶可以看作dp[n]=0+min(dp[n-1],dp[n-2])
vector<int> dp(cost.size(),0);
dp[0] = cost[0];
dp[1] = cost[1];
//注意i开始的下标
for(int i=2; i<cost.size(); i++)
{
dp[i] = min(dp[i-1],dp[i-2])+cost[i];
}
return min(dp[cost.size()-1], dp[cost.size()-2]) ;
}
};
解法二
dp[i]的花费不包含当前下标i阶梯的费用
dp[0] = 0; //初始化
dp[1] = 0;
dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]); //递推公式
int n = cost.size();
dp[n]表示到达阶梯顶部的最小1费用
代码
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size()+1,0);
dp[0] = 0;
dp[1] = 0;
//注意i开始的下标
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()];
}
};
不同的dp数组和下标含义,初始化的赋值也不一样;