你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額。
示例 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 。
0 <= nums.length <= 100
0 <= nums[i] <= 400
從前往後看,如果偷竊第 k
kk 間房屋,則下一間應該為第k+2
k+2k+
2間或第k+3
k+3k+
3間從後往前看,如果偷竊第 k
kk 間房屋,那麼偷竊總金額為前 k−2
k-2k−
2 間房屋的最高總金額與第 k
kk間房屋的金額之和。如果不偷竊第 k
kk 間房屋,那麼偷竊總金額為前 k−1
k-1k−
1 間房屋的最高總金額。
用 d p[
i]
dp[i]
dp[i
]表示前 i
ii間房屋能偷竊到的最高總金額,那麼就有如下的狀態轉移方程:
dp [i
]=
max(dp
[i−2
]+
nums[i
],dp[
i−1]
)\textit[i] = \max(\textit[i-2]+\textit[i], \textit[i-1])
dp[i]
=max(dp
[i−2
]+nums[i
],dp[
i−1]
)此問題的最小問題為只有一間房屋和只有兩間房屋,所有問題都可以分解成若干最小問題。
class
solution
:def
rob(self, nums: list[
int])-
>
int:
n =len(nums)
#沒有房屋
if n ==0:
return
0#只有一間房屋
if n ==1:
return nums[0]
#只有兩間房屋
if n ==2:
return
max(nums[0]
, nums[1]
)...
#dp[i]表示前 i間房屋能偷竊到的最高總金額
dp =[0
]* n
dp[0]
= nums[0]
dp[1]
=max
(nums[0]
, nums[1]
)for i in
range(2
, n)
: dp[i]
=max
(dp[i-1]
, dp[i-2]
+ nums[i]
)return dp[n-1]
...#優化儲存空間
first = nums[0]
second =
max(nums[0]
, nums[1]
)for i in
range(2
, n)
: tmp=second
second =
max(second, first+ nums[i]
) first=tmp
return second
198 打家劫舍
很明顯是dp問題。用乙個一維陣列表示dp陣列,狀態轉移方程為 resmax index max nums index resmax index 2 resmax index 1 其中resmax儲存,遍歷到該節點時的,最大值。注意,遍歷到該節點,但該節點不一定選。另外該題的初始解要想清楚。即resm...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...