1. 程式人生 > >【LeetCode】70. 爬樓梯——dp

【LeetCode】70. 爬樓梯——dp

題目

陣列的每個索引做為一個階梯,第 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; } };