dp和nums等长就行 和上台阶差不多 取决于前面两个房子的价值
class Solution:
def rob(self, nums: List[int]) -> int:
if not nums: return 0
if len(nums)==1: return nums[0]
dp=[0]*len(nums)
dp[0]=nums[0]
dp[1]=max(nums[0],nums[1])
for i in range(2,len(nums)):
dp[i]=max(dp[i-2]+nums[i],dp[i-1])
return dp[-1]
成环的话就是含头和含尾各做一遍
class Solution:
def rob(self, nums: List[int]) -> int:
if not nums: return 0
if len(nums)==1: return nums[0]
return max(self.robs(nums[:-1]),self.robs(nums[1:]))
def robs(self,nums):
if len(nums)==1:return nums[0]
dp=[0]*len(nums)
dp[0]=nums[0]
dp[1]=max(nums[0],nums[1])
for i in range(2,len(nums)):
dp[i]=max(dp[i-1],dp[i-2]+nums[i])
return dp[-1]
一个树形dp 每个节点的两个值分别的抢与不抢本节点 靠后序迭代
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def rob(self, root: Optional[TreeNode]) -> int:
dp=self.treedp(root)
return max(dp)
def treedp(self,node):
if not node: return (0,0)
left=self.treedp(node.left)
right=self.treedp(node.right)
val0=max(left)+max(right)
val1=node.val+left[0]+right[0]
return (val0,val1)