1. 程式人生 > >[LeetCode]198. 打家劫舍(House Robber)

[LeetCode]198. 打家劫舍(House Robber)

一、題目:

LeetCode地址

你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互

連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定一個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

示例 1:

輸入: [1,2,3,1]

輸出: 4

解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。

     偷竊到的最高金額 = 1 + 3 = 4 。

示例 2:

輸入: [2,7,9,3,1]

輸出: 12

解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1)。

     偷竊到的最高金額 = 2 + 9 + 1 = 12 。

二、分析:

該題利用了五大演算法之二:動態規劃演算法

1、基本概念:

     動態規劃過程是:每次決策依賴於當前狀態,又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。

2、基本思想與策略:

     基本思想與分治法類似,也是將待求解的問題分解為若干個子問題,按順序求解子階段,前一子問題的解,為後一子問題的求解提供了有用的資訊。在求解任一子問題時,列出各種可能的區域性解,通過決策保留那些有可能達到最優的區域性解,丟棄其他區域性解。依次解決各子問題,最後個子問題就是初始問題的解。

具體請自行百度

三、Java程式碼

private static int minCostClimbingStairs(int[] nums) {
        int curMax = 0, curPrePreMax = 0;
        for (int cur : nums) {
            int temp = curMax;
            curMax = Math.max(curMax, curPrePreMax + cur);
            curPrePreMax = temp;
        }
        return curMax;
    }

對於該題而言,迴圈遍歷所有的房屋,決策後,儲存前兩次的決策結果,從上次的決策結果與上上次的決策結果中,再次決策出最優解,從而避免了[2,7,9,3,1,9]的結果是2+9+9,而不是7+3+9。

四、提交結果