#coding=utf-8
#递归
class Solution1(object):
def rob(self, nums):
"""
:type nums: 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):
"""
:type nums: 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):
"""
:type nums: 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):
"""
:type nums: 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]
动态规划_leetcode198
猜你喜欢
转载自www.cnblogs.com/lux-ace/p/10546518.html
今日推荐
周排行