leetcode198 打家劫舍

2021-09-29 23:06:31 字數 1193 閱讀 3889

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

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

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

選或者不選系列,求最大值,首先考慮動態規劃

dp[i] 表示 [0, i] 區間可以搶奪的最大值,對當前i來說,有搶和不搶兩種互斥的選擇,不搶即為 dp[i-1](等價於去掉 nums[i] 只搶 [0, i-1] 區間最大值),搶即為 dp[i-2] + nums[i](等價於去掉 nums[i-1])

需要初始化 dp[0] 和 dp[1],其中 dp[0] 即為 num[0],dp[1] 此時應該為 max(num[0], num[1])

class solution(object):

def rob(self, nums):

""":type nums: list[int]

:rtype: int

"""if not nums:

return 0

size=len(nums)

if size == 1:

return nums[0]

if size == 2:

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

dp=[0 for _ in range(size)]

dp[0]=nums[0]

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

for i in range(2,size):

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

return dp[size-1]

LeetCode 198 打家劫舍

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

LeetCode198 打家劫舍

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

LeetCode198 打家劫舍

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