198. House Robber
题目描述
从一个数组中取(rob)若干数, 使得结果(money)最大, 这些数不能相邻
Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.
解题思路
无法直接确定哪些数要取, 所以要用到动态规划. 比较经典的思路.
T[k]表示的是在前k位置里能累计的最大分值(money)
递归方程是: T[k] = max(T[k-2]+nums[k], T[k-1])
如果上一个位置未被选择, 则当前位置k的得分为: T[k-1] (因为这个位置就不能选了)
如果上一个位置已经被选择, 则当前位置k的得分为: T[k-2]+nums[k]
取两者大值, 保存到T[k].
代码
Python
class Solution:
def rob(self, nums: List[int]) -> int:
if len(nums) == 0:
return 0
rob = [0] * len(nums)
for i in range(len(nums)):
if i == 0:
rob[i] = nums[0]
elif i == 1:
rob[i] = max(nums[0], nums[1])
else:
rob[i] = max(rob[i-2]+nums[i], rob[i-1])
return rob[-1]