dp思想:
再不觸發警報的前提下偷到第i間屋子能偷竊到的最高金額 = 偷到第i-2間屋的最高金額+第i間屋有的金額(這個思路是錯的!!!)
而是,小偷在路過某個房間時可以決定偷與不偷,而且不一定非得隔乙個房間偷一次(只是不能連續偷取相鄰房間裡的錢)。比如[1,2,100,1,2,100]能偷取的最大金額應該是200(這就是不是隔乙個房間偷一次)
所以,這個dp思想應該這麼想:
小偷路過第i號房間時身上已偷到的最大金額res[i] = max(res[i-2]+nums[i],res[i-1])
怎麼理解?小偷路過第i號房間有兩種選擇:
case1 :偷第i號房間,要使能夠在不觸發警報的前提下偷到第i間屋子那麼在路過第i-1號房間時小偷只能啥也不幹也就是不能偷,所以此時dp[i-1]只能=dp[i-2]也就是再路過第i-1號房間時只做case2選擇,所以.能偷竊到的最高金額 = 偷到第i-2間屋的最高金額+第i間屋有的金額(,所以此時res[i] = res[i-2]+nums[i]
case2:不偷第i號房間此時,該小偷身上的最大金額即為路過第i-1號房間所持有的金額也就是此時res[i]=res[i-1]
那麼最終小偷路過第i號房間所持有的最大金額當然就是case1與case2兩者中的最大值
最終,小偷走過最後乙個房間後所持有的金錢即為能偷到的最大金額
class solution
return res[nums.length-1];
}}
198 打家劫舍
很明顯是dp問題。用乙個一維陣列表示dp陣列,狀態轉移方程為 resmax index max nums index resmax index 2 resmax index 1 其中resmax儲存,遍歷到該節點時的,最大值。注意,遍歷到該節點,但該節點不一定選。另外該題的初始解要想清楚。即resm...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...