学习安排根据《代码随想录》
跳了——leetcode746
根据 动规五步,自己写了一个代码,漏洞百出:【以下是错的】
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost)
{
int n=cost.size();
int result;
vector<int>dp(n+1);
// 确定 dp[i] 及含义 :dp[i] 表示 从第 i 个台阶开始的总花费 dp
//确定 递推公式:dp[i]=min(cost[i-1],cost[i-2])
// 确定初始化:dp[0]=cost[0],dp[1]=min(cost[0],cost[1]);
dp[0]=cost[0];dp[1]=min(cost[0],cost[1]);
//确定遍历顺序
for(int i=2;i<n;i++)
{ dp[i]=min(cost[i-1],cost[i-2]);result=dp[i];}
//验证dp
return result;
}
};
正确代码及思路:
1.确定dp数组 以及含义:i 表示 第i 个台阶开始,dp[i]表示 到达第 i 个台阶所花费的最少体力
2.确定递推公式:dp[i]=min(dp[i-1],dp[i-2])+cost[i]
(为什么是cost[i]?不是cost[i-1] or cost[i-2]? 答:到达第 i 个台阶 也需要花费 当前台阶的体力
3.初始化:dp[0]=cost[0],dp[1]=cost[1]
(为什么cost[1]不是求最小? 答:下标为1 为 2个台阶 题目说明 可以一步跨一个台阶 或者两个台阶)
4.确定遍历顺序:从前往后
5.验证dp
代码:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size());
int result;
dp[0] = cost[0];
dp[1] = cost[1];
for (int i = 2; i < cost.size(); i++) {
dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
}
// 注意最后一步可以理解为不用花费,所以取倒数第一步,第二步的最少值!!!!
result=min(dp[cost.size()-1],dp[cost.size()-2]);
return result;
}