動態規劃之 198 打家劫舍I

2021-10-08 21:02:34 字數 1194 閱讀 7733

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定乙個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額。

示例 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 。

給了乙個陣列,讓你去打家劫舍。要求是不能連續打劫兩家,否則觸動警報就會被抓;如果只有一戶人家,那沒得選只能打劫了,如果有兩戶人家只能選擇一戶人家進行打劫就是金額最大的那家。那如果有k(k>2)戶人家,如何打劫呢?分為兩種情況:①打劫k戶人家,那麼就不能動k-1戶那家人了;因此打劫的金額就是k-1家最大值和k家的錢;②不打劫k戶人家,因此偷竊的最高金額就是在第k-1家偷竊的金額。

class solution:

def rob(self, nums: list[int]) -> int:

#動態規劃

#偷竊第 k 間房屋,那麼就不能偷竊第 k-1間房屋,偷竊總金額為前 k-2間房屋的最高總金額與第 k 間房屋的金額之和。

#不偷竊第 k 間房屋,偷竊總金額為前 k-1 間房屋的最高總金額。

if not nums:

return 0

if len(nums)<3:

return max(nums)

dp = [0]*len(nums)

dp[0],dp[1] = nums[0],max(nums[0],nums[1])

for i in range(2,len(nums)):

dp[i] = max(dp[i-2]+nums[i],dp[i-1])

return dp[-1]

總結:又是動態規劃,找這個動態轉移方程就比較困難;但是往往這個轉移的動態方程是乙個遞推的乙個過程。

198 打家劫舍(動態規劃)

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...

198 打家劫舍(動態規劃)

1.問題描述 你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你不觸動警報裝置的情況下 一夜之內能夠偷竊到的最高金額...

198 打家劫舍

很明顯是dp問題。用乙個一維陣列表示dp陣列,狀態轉移方程為 resmax index max nums index resmax index 2 resmax index 1 其中resmax儲存,遍歷到該節點時的,最大值。注意,遍歷到該節點,但該節點不一定選。另外該題的初始解要想清楚。即resm...