[LeetCode]198. 打家劫舍(House Robber)
阿新 • • 發佈:2018-11-19
一、題目:
你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互
連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 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。