一:题目
二:上码
class Solution {
public:/**思路:1.分析题意给出的数组的下标代表楼梯的台阶数2.动态规划五步走1>:确定dp数组以及下标的含义dp[i]:表示到达第i层所需要花费的体力2>:确定dp数组的递推公式那么如何得到dp[i](花费的体力)呢?dp[i]由dp[i-1]或者dp[i-2]可以得到,但是我们需要在其中选取一个小的dp[i] = min(dp[i-1],dp[i-2]) + cost[i];为甚要加上cost[i],题目中给出了,我们每到一个台阶的话,需要支付cost[i]才能继续向上爬3>:确定dp数组的初始化cost.size() == 2那么的话,可以直接一步到楼顶(那就不用花费),也可以从0开始dp[0] = cost[0],然后再来一步到达楼顶 那就直接返回dp[0]和dp[1]中比较小的那个 (如果这个size() == 2) cost.size() > 2dp[0] = cost[0];dp[1] = cost[1];4>:确定dp数组的遍历顺序这个肯定也是需要从前往后遍历,因为我们需要前面花费的体力5>:举例验证cost = [10,15,2,10]dp[3] = min(dp[2],dp[1]) (这里不用加上cost[3],因为最后一步就直接登顶了)dp[2] = min(dp[1],dp[0]) + cost[2]; **/int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();vector<int>dp(n+1);dp[0] = cost[0];dp[1] = cost[1];if(n == 2) return min(dp[0],dp[1]);for(int i = 2; i <= n; i++) {if(i == n){//最后一步是直接到达楼顶的,不需要计算楼顶那层的自己的费用dp[i] = min(dp[i-1],dp[i-2]);}else{dp[i] = min(dp[i-1],dp[i-2]) + cost[i];}}return dp[n];}
};