思路
很标准的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]; } };
评论
还没有任何评论,你来说两句吧!