最小花费上楼梯
https://leetcode.cn/problems/min-cost-climbing-stairs/
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
因为一定是2个元素的,所以我们从2个分析:
因为可以从0或1开始,那么他们就没有到达价值,就是到达这一个不用花费。
,然后我们要上到楼顶可以选择从0上到楼顶,也可以从1到楼顶,然后加上那一节的花费。
10 15 20
15
就是从1开始,花费15直接到楼顶,而不是从0花费10到20在花费20到楼顶(30)