【Leetcode】打家劫舍 I and 打家劫舍 II(動態規劃)PYTHON
阿新 • • 發佈:2019-01-09
198.打家劫舍
題目表述:
你是一個專業的強盜,計劃搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡警方。
給定一個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒警方的情況下搶劫的最高金額。
PYTHON:
class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
ll = [0 for i in range(n)]
if n == 0:
return 0
if n == 1:
return nums[0]
if n == 2:
return max(nums)
else:
ll[0] = nums[0]
ll[1] = max(nums[0],nums[1])
for i in range(2,len(nums)):
ll[i] = max(ll[i-2 ] + nums[i],ll[i-1])
return ll[n-1]
- 打家劫舍 II
題目描述:
在上次盜竊完一條街道之後,竊賊又轉到了一個新的地方,這樣他就不會引起太多注意。這一次,這個地方的所有房屋都圍成一圈。這意味著第一個房子是最後一個是緊挨著的。同時,這些房屋的安全系統與上次那條街道的安全系統保持一致。
給出一份代表每個房屋存放錢數的非負整數列表,確定你可以在不觸動警報的情況下盜取的最高金額。
PYTHON:
class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
out1 = [0 for x in range(n)]
out2 = [0 for x in range(n)]
if n == 0:
return 0
if n == 1 :
return nums[0]
if n == 2 :
return max(nums[0],nums[1])
else:
out1[0] = nums[0]
out2[1] = nums[1]
out1[1] = max(nums[0],nums[1])
out2[2] = max(nums[1],nums[2])
for i in range(2,n-1):
out1[i] = max(out1[i-2] + nums[i],out1[i-1])
out2[i+1] = max(out2[i-1] + nums[i+1],out2[i])
return max(out1[n-2],out2[n-1])
思路:因為房子是環形的,所以不能在打劫了第一座房子之後還打劫第二座房子,所以說分兩種情況分別計算:1,不打劫第一座房子;2,不打劫最後一座房子,取最大即可。