https://leetcode-cn.com/problems/min-cost-climbing-stairs/
示例 1:
输入:cost = [10, 15, 20]
输出:15
解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。
示例 2:
输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出:6
解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。
题意就是当前没到达一个楼梯如果想继续前进的话就需要开销当前楼梯的开销,直到其中的楼梯顶端,而且每一次到达之后只能再走一步或者是走两步。这样分问题的时候应该是从反方向开始分析,也就是说能够到达当前节点的前面的步骤中只有前面的一步或者是前面的两部,那么需要是开销最小的话就需要前面的两者中的较小值与当前的点的权重来进行求和,传递到下一个对应的节点。同时初始化的时候对应的第一个是第一个第二个也是第二个,但是考虑到只有两个节点的时候,那么应该是取两者之间的最小值,因为最开始也是一样的每次都可以跳动两步或者一步的。实现的代码如下:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int>dp(cost.size());
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];
}
return min(dp[cost.size() - 1], dp[cost.size() - 2]);
}
};