你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。首先就是不能搶相鄰的,我就想是不是就兩個結果,奇數下標和,偶數下標和,但是後來有乙個問題,如果是[2,1,1,3]這種就是5,所以不行。最後用動態規劃做的。示例 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 。
動態規劃
先看為什麼[2,1,1,3]的結果為什麼是5,因為按照最開始想的就兩個結果,奇數下標和事3,偶數下標和是4。但是我選擇第乙個數2,不選擇第二個1,但是如果我選擇了第三個數1,就選不了第四個數3了,所以選了2,3,結果是5。
初始化dp為全0的長度是len(nums) + 1的陣列
dp[0] = 0
然後在計算dp[1]時,dp[1] = nums[0]
但是到了i>=2,dp[i]的時候,就不一樣了,我可以選擇nums[i-1]這個數,也可以不選,如果不選的話就是dp[i-1],選的話是dp[i - 2] + nums[i-1],求最大值,就是max(dp[i-1], dp[i - 2] + nums[i-1])
**
class
solution
:def
rob(self, nums: list[
int])-
>
int:
dp =[0
for _ in
range
(len
(nums)+1
)]for i in
range(1
,len
(dp)):
if i >=2:
dp[i]
=max
(dp[i-1]
, dp[i -2]
+ nums[i-1]
)else
: dp[i]
= nums[i-1]
return dp[-1
]
198 打家劫舍
很明顯是dp問題。用乙個一維陣列表示dp陣列,狀態轉移方程為 resmax index max nums index resmax index 2 resmax index 1 其中resmax儲存,遍歷到該節點時的,最大值。注意,遍歷到該節點,但該節點不一定選。另外該題的初始解要想清楚。即resm...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...