#coding=utf-8#遞迴class solution1(object):
def rob(self, nums):
""":typenums: list[int]
:rtype: int
"""return self.tryrob(nums,0)
# 考慮搶劫nums[index,...,len(nums)-1],這個範圍的所有房子
# 不一定非要偷取nums[index]這個房子
def tryrob(self,nums,index):
if index >= len(nums):
return 0
res = 0
for i in range(index,len(nums)):
res = max(res,nums[index] + self.tryrob(nums,index+2))
return res
#記憶化遞迴 自己的錯誤寫法
class solution2(object):
def rob(self, nums):
""":typenums: list[int]
:rtype: int
"""# memo[i] 表示搶劫 nums[i,...n-1] 所能獲得的最大收益
self.memo = [-1 for i in range(len(nums))]
return self.tryrob(nums,0)
# 考慮搶劫nums[index,...,len(nums)-1],這個範圍的所有房子
# 不一定非要偷取nums[index]這個房子
def tryrob(self,nums,index):
if index >= len(nums):
return 0
# 一開始就需要考慮原問題是否被再次遇到,沒遇到就會進入遞迴過程
res = 0
for i in range(index,len(nums)):
if index + 2 < len(nums) and self.memo[index+2] != -1:
res = max(res, nums[index] + self.self.memo[index+2])
elif index + 2 < len(nums) and self.memo[index+2] == -1:
self.memo[index + 2] = self.tryrob(nums,index+2)
res = max(res, nums[index] + self.self.memo[index+2])
else:
self.memo[index] = nums[index]
res = self.memo[index]
return res
#記憶化遞迴 大神的寫法
class solution22(object):
def rob(self, nums):
""":typenums: list[int]
:rtype: int
"""# memo[i] 表示搶劫 nums[i,...n-1] 所能獲得的最大收益
self.memo = [-1 for i in range(len(nums))]
return self.tryrob(nums, 0)
# 考慮搶劫nums[index,...,len(nums)-1],這個範圍的所有房子
# 不一定非要偷取nums[index]這個房子
def tryrob(self, nums, index):
if index >= len(nums):
return 0
if self.memo[index] != -1:
return self.memo[index]
res = 0
for i in range(index, len(nums)):
res = max(res, nums[i] + self.tryrob(nums,i+2))
self.memo[index] = res
return res
# 動歸自己的寫法
class solution3(object):
def rob(self, nums):
""":typenums: list[int]
:rtype: int
"""if not nums:
return 0
return self.tryrob(nums)
def tryrob(self, nums):
length = len(nums)
if length == 1:
return nums[0]
if length == 2: return max(nums[0],nums[1]) # memo[i] 表示搶劫 nums[i,...n-1] 所能獲得的最大收益 memo = [-1 for i in range(length)] memo[length-1] = nums[length-1] memo[length-2] = max(nums[length-1],nums[length-2]) for i in range(length-3,-1,-1): for j in range(i,length): if j+2 < length: memo[i] = max(memo[i],nums[j] + memo[j+2]) else: memo[i] = max(memo[i],nums[j]) return memo[0] # 大神的寫法class solution4(object): def rob(self, nums): """ :type nums: list[int] :rtype: int """ if not nums: return 0 length = len(nums) memo = [-1 for i in range(length)] memo[length-1] = nums[length-1] for i in range(length-2 ,-1 ,-1): for j in range(i,length): if j+2 < length: memo[i] = max(memo[i] ,nums[j] + memo[j+2]) else: memo[i] = max(memo[i],nums[j]) return memo[0]
leetcode 198強盜搶劫(動態規劃)
題目 你是乙個專業的強盜,計畫在街上搶劫房屋。每個房子都藏著一定數量的錢,阻止你搶劫他們的唯一限制因素是相鄰的房屋有連線的安全系統,如果兩個相鄰的房子在同乙個晚上被闖入,它將自動聯絡 給出乙個代表每個房子的金額的非負整數列表,確定今晚可以搶劫的最大金額而不警告警察。input 2,7,9,3,1 o...
leetcode198 打家劫舍,動態規劃
題目 你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 示例 ...
leetcode 198 打家劫舍 動態規劃
題目 你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸...