正文索引 [隐藏]

传送门

思路

很标准的dp。设dp[i]为当前状态下最小花费,因为可以一次爬一步或者一次爬两步,所以dp[i]=min(dp[i-1], dp[i-2])+cost[i]。又因为可以从第0级或第1级台阶开始爬,所以初始状态为dp[0]=cost[0],dp[1]=cost[1]。

值得注意的是,这题判断到达终点的条件并不是走到最后一级(cost.size()-1),你直接跨过去也算,也就是说在倒数第二级台阶上时你直接上两级也算为上到顶(或者理解为最后一级台阶之后还有一级无消耗的台阶),即第一组样例给出的情况。对于这种特殊情况,我们手动给cost数组pushback一个0就行了。

代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int dp[1010];
        cost.push_back(0);
        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 dp[cost.size() - 1];
    }
};