PROBLEM:
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]
.
SOLVE:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n=cost.size();
vector<int> dp(n);
dp[0]=cost[0];
dp[1]=cost[1];
for(int i=2;i<n;i++)
dp[i]=cost[i]+min(dp[i-1],dp[i-2]);
return min(dp[n-1],dp[n-2]);
}
};
分析:此为动态规划问题,假设如果要到达i-th台阶(这里把当前i-th台阶的费用也算上),最少的花费为dp[i],则:dp[0]=cost[0];dp[1]=cost[1];dp[i]=cost[i]+min(dp[i-1],dp[i-2])。同时也要注意这里并没有用到递归而是迭代,其实只要三个变量就够了(循环交换),不需要整个dp数组。