动态规划数组的经典题目
198. House Robber
class Solution:
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) ==0:
return 0
elif len(nums) == 1:
return nums[0]
elif len(nums) == 2:
return max(nums)
else:
max1=nums[0]
max2=max(max1,nums[1])
for i in range(2,len(nums)):
max3 = max(max1+nums[i],max2)
max1,max2=max2, max3
return max3
213. House Robber II 分成两种情况,打劫第一个和不打劫
class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n=len(nums)
if n==0:
return 0
elif n<=3:
return max(nums)
elif n==4:
return max(nums[0]+nums[2],nums[1]+nums[3])
else:
max1=nums[2]
max2=max(max1,nums[3])
for i in range(4,n-1):
max3=max(max1+nums[i],max2)
max1,max2=max2,max3
re1=max2+nums[0]
max1=nums[1]
max2=max(max1,nums[2])
for i in range(3,n):
max3=max(max1+nums[i],max2)
max1,max2=max2,max3
return max(re1,max3)
337. House Robber III 遍历到某一节点时 max(现在的,先前的+根节点值)等价于 max(左节点的最大值+右节点的最大值,根节点值+左右节点取不到自己的最大值) 所以这样设置Res,res[0]是取不到当前节点的最大值,res[1]是当前的最大值
class Solution(object):
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""
def DFS(root):
if not root: return [0,0]
Lres=DFS(root.left)
Rres=DFS(root.right)
cur=Lres[1]+Rres[1]
maxV=max(Lres[0]+Rres[0]+root.val,cur)
return [cur,maxV]
return DFS(root)[1]