【LeetCode】70. 爬樓梯——dp
阿新 • • 發佈:2019-02-06
題目
陣列的每個索引做為一個階梯,第 i個階梯對應著一個非負數的體力花費值 cost[i] (索引從0開始)。
每當你爬上一個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬一個階梯或者爬兩個階梯。
您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。
示例
輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
輸出: 6
解釋: 最低花費方式是從cost[0]開始,逐個經過那些1,跳過cost[3],一共花費6。
解答
f(n)代表爬n個階梯的最小花費,f(1)=0,f(2)=min(cost(1), cost(2))
當前最小花費分兩種情況:1.以cost(n)結尾,2.以cost(n-1)結尾,因此狀態方程如下:
f(n) = min(f(n-1)+cost(n), f(n-2)+cost(n-1))
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
// f(n) = min(f(n-1)+cost(n), f(n-2)+cost(n-1))
int size = cost.size();
int num1, num2;
num1 = 0; // f(n-2)
num2 = min(cost[0], cost[1]); // f(n-1)
for (int i = 2; i < size; i++) {
int min_cost = min(num1 + cost[i-1], num2 + cost[i]);
num1 = num2;
num2 = min_cost;
}
return num2;
}
};