最小花费上楼梯

发布时间 2023-05-20 11:25:43作者: E_sheep

https://leetcode.cn/problems/min-cost-climbing-stairs/

image

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int size=cost.size();
        vector <int> dp (size+1);//表示的是到达第i层的最小花费
        dp[0]=dp[1]=0;
        for(int i=2;i<size+1;i++){//=size 就是到size+1
            dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[size];//size,就是第size+1位置,就是楼顶
    }   
};  

题目问你的是到达楼顶的最小花,那么其实就是要求到达第i阶所需要的最小花费,进而我们设dp[i]代表到达第i阶的最小花费

由题意得:
楼顶在第size+1的位置,题目给你的是所有楼梯的价值,让你求的是到达楼顶的价值,也就是size+1位置的值。

那么我们的数组就开到size+1,循环也是开到size+1的位置,返回的是size位置,数组从0开始,也就是第size+1上的值。

dp方程分析:
dp代表的是到达第i阶的最小价值,我这一阶可以从两种方式到达,一种是从i-1(上一阶)到,就是dp[i-1] 到达第i-1处所花费的最小价值,加上cost[i-1] 上一阶要走的话所支付的费用。

同理,从上上阶上来到这一阶就是dp[i-2]+cost[i-2],

再对这两种情况,取最小值,以确定这一阶怎么走花费最小。

dp[0]=dp[1]=0
image
因为一定是2个元素的,所以我们从2个分析:
因为可以从0或1开始,那么他们就没有到达价值,就是到达这一个不用花费。

,然后我们要上到楼顶可以选择从0上到楼顶,也可以从1到楼顶,然后加上那一节的花费。

10 15 20
15

就是从1开始,花费15直接到楼顶,而不是从0花费10到20在花费20到楼顶(30)