你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都 圍成一圈 ,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警 。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你 在不觸動警報裝置的情況下 ,能夠偷竊到的最高金額。
示例1:
輸入:nums = [2,3,2]
輸出:3
解釋:你不能先偷竊 1 號房屋(金額 = 2),然後偷竊 3 號房屋(金額 = 2), 因為他們是相鄰的。
這個偷跟之前的打家劫舍非常類似,只是現在房子排成了乙個圈。
因此房子0和房子1成了鄰居,不能夠被同時偷盜。因此要麼眉頭房子0,要麼沒偷房子n-1。
所以我們其實只需要列舉兩種情況就可。
情況1:沒偷房子0
最優策略就是竊賊對於房子1~n-1的最優策略,這個時候轉化為了之前的打家劫舍的情況。
情況2:沒偷房子n-1
這種情況下的最優策略就是竊賊對於房子0~n-2的最優策略,這個時候轉化為了之前的打家劫舍的情況。
通過以上分析之後,我們直接在兩種情況下分別求打家劫舍問題,就可以完成最終的實現了。
#主要是分情況討論,就變成了兩個動態規劃的題目
class
solution
:def
rob(self, nums: list[
int])-
>
int:
iflen
(nums)==0
:return0if
len(nums)==1
:return nums[0]
iflen
(nums)==2
:return
max(nums[0]
,nums[1]
) dp =[0
for i in
range
(len
(nums))]
dp[0]
=nums[0]
dp[1]
=max
(nums[1]
,nums[0]
)#帶0不帶n-1的情況
for i in
range(2
,len
(nums)-1
):dp[i]
=max
(dp[i-1]
,dp[i-2]
+nums[i]
) max1=dp[
len(nums)-2
]#不帶n-1帶0的情況
dp[0]
=nums[1]
dp[1]
=max
(nums[1]
,nums[2]
)for i in
range(2
,len
(nums)-1
):dp[i]
=max
(dp[i-1]
,dp[i-2]
+nums[i+1]
)return
max(max1,dp[
len(nums)-2
])
動態規劃 打家劫舍2
題目 你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動...
動態規劃 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
打家劫舍 動態規劃
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...