Part1:问题描述
On a staircase, the i
-th step has some non-negative cost cost[i]
assigned (0 indexed).
Once you pay the cost, you can either climb one or two steps. You need to find minimum cost to reach the top of the floor, and you can either start from the step with index 0, or the step with index 1.
Example 1:
Input: cost = [10, 15, 20] Output: 15 Explanation: Cheapest is start on cost[1], pay that cost and go to the top.
Example 2:
Input: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] Output: 6 Explanation: Cheapest is start on cost[0], and only step on 1s, skipping cost[3].
Note:
cost
will have a length in the range[2, 1000]
.- Every
cost[i]
will be an integer in the range[0, 999]
.
Part2:解题思路
感觉自己对动态规划解题还是不太能找到思路,参考别人的文章之后下面说说自己的理解:
到达top的代价问题可以划分为子问题:到达第i 阶的代价。
到达第i阶又有2种方式:从第i-1阶到达(走一步到达),代价为cost[i-1]+cost_1;从i-2阶到达(走两步到达),代价为cost[i-2]+cost_2。从2种方式里面选择代价最小的作为到达当前第i阶的代价。
除了对当前代价的计算外,我们还要考虑到达当前阶之后对下一步计算的影响,即更新cost_1和cost_2的值。因为到达当前阶之后,到达当前阶的代价对于到达下一阶而言是通过一步达到的代价,通过一步到达当前阶的代际对于到达下一阶而言是通过两步到达的代价。
参考文章:http://blog.csdn.net/u012509485/article/details/78836412
Part3:代码
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int cost_1 = 0;
int cost_2 = 0;
int total_cost = 0;
int length = cost.size();
for (int i = 2; i <= length; i++) {
total_cost = min(cost[i - 1]+cost_1, cost[i - 2]+cost_2);
cost_2 = cost_1;
cost_1 = total_cost;
}
return total_cost;
}
};