leetcode 198 打家劫舍 動態規劃

2021-09-14 02:23:00 字數 1645 閱讀 5080

題目:

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

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

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

思路:

暴力:每個房間有盜取和不盜取兩種情況,類似求子集,時間複雜度o(2^n)

動態規劃

由於同時從相鄰的兩個房屋中盜取會觸發警報所以:

1.若選擇第i個房間盜取財寶,就一定不能選擇第i-1個房間盜取財寶

2.若不選擇第i個房間,相當於只考慮前i-1個房間

1.確認原問題與子問題

原問題是求n個房間的最優解,子問題是求前1個房間,前2個房間.....,前n-1個房間的最優解

2.確認狀態

第i個狀態即為前i個房間能夠獲得的最大財寶(最優解)

3.確認邊界狀態的值

前1個房間的最優解,就是第1個房間的財寶值

前2個房間的最優解,就是第1,2個房間中較大的值

4.確定狀態轉移方程

a.選擇第i個房間:第i個房間+前i-2個房間的最優解

b.不選擇第i個房間:前i-1個房間的最優解

轉移方程:res[i] = max( res[i-1],  nums[i]+res[i-2] ); i>=3

**:

class solution(object):

def rob(self, nums):

""":type nums: list[int]

:rtype: int

"""if len(nums) == 0:

return 0

if len(nums) == 1:

return nums[0]

if len(nums) == 2:

return max(nums[0],nums[1])

res = [none]*(len(nums))

res[0] = nums[0]

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

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

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

return res[len(nums)-1]

LeetCode 198 打家劫舍

題目 你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。思路 本題的大致意思就是求取乙個...

LeetCode198 打家劫舍

你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。簡單的動態規劃問題,題目意思是計算陣列...

LeetCode198 打家劫舍

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