你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有必定的現金,影響你偷竊的惟一制約因素就是相鄰的房屋裝有相互連通的防盜系統,若是兩間相鄰的房屋在同一夜被小偷闖入,系統會自動報警。算法
給定一個表明每一個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的狀況下,可以偷竊到的最高金額。 示例1:數組
輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號房屋 (金額 = 1) ,而後偷竊 3 號房屋 (金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。
複製代碼
示例2:ui
輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接着偷竊 5 號房屋 (金額 = 1)。
偷竊到的最高金額 = 2 + 9 + 1 = 12 。
複製代碼
標題頗有吸引力。其實,時間纔是那個最專業的小偷啊。。。
言歸正傳,這道題做爲動態規劃的入門題目,仍是頗有意思的。咱們分析題目能夠得知,小偷君不能偷相鄰的兩家,而後咱們遞推一下,思考小偷的偷竊過程:他會從第一家一直看到最後一家,到每一家的時候,他會但願本身如今得到的錢是當前爲止所能得到的最多的。spa
OK,咱們會發現:
他若是選擇偷這一家,他就必定沒有偷上一家,因此,他所能得到的最大金錢就是在當前家能得到的金錢加上在上上家擁有的錢數的和;
他若是不選擇這一家,那麼他當前獲取的最大金錢就是上一家擁有的錢; 固然,他會選擇以上兩種方案的最大值。code
代碼先奉上:cdn
func rob(nums []int) int {
l := len(nums)
if l == 0 {return 0}
if l == 1 {return nums[0]}
if l == 2 {return max(nums[0],nums[1])}
nums[1] = max(nums[0],nums[1])
//正如上邊所說
for i:=2;i<l;i++{
nums[i] = max(nums[i-2]+nums[i],nums[i-1])
}
return nums[l-1]
}
func max(a int,b int) int {
if a > b {return a}
return b
}
複製代碼
動態規劃的思惟頗有意思,咱們能夠利用其對生活也進行一次推演。不一樣於貪心的即時獲利,咱們要放長線才能釣大魚。加油!leetcode
算法夢想家,來跟我一塊兒玩算法,玩音樂,聊聊文學創做,我們一塊兒天馬行空!it