动态规划_leetcode198

#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]
posted @ 2019-03-17 12:53  AceKo  阅读(120)  评论(0编辑  收藏  举报