题目来源
https://leetcode.com/problems/house-robber-ii/description/题目描述
Note: This is an extension of House Robber.
After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in acircle. That means the first house is the neighbor of the last one.Meanwhile, the security system for these houses remain the same as for those in the previous street.
Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.
题意分析
这个题目是另一个题目LeetCode 198.Houser Robber的扩展,相应的解题分析在我的另一篇博客LeetCode 198.House Robber 解题分析中。
大意是一排房子按环状排列,每间房子有一定数量的钱,我们的任务是在不进入相邻房子的前提下得到最多的钱。
题目思路
总体思路是将一个环形DP(Dynamic Programming)问题分解成两个线性DP问题。第一个线性问题,由于房子环状排列,若选择从0号房子开始取钱,那么列表中的最后一个房子则不能进入取钱;第二个线性问题,若选择从1号房子开始取钱,那么0号房子不能进入取钱。取两个结果中的最大值就是全局最大值。
实现代码(Python3)
class Solution:
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) == 1:
return nums[0]
return max(self.rob_pre(nums[-1]), self.rob_pre(nums[1:]))
def rob_pre(self, nums):
if len(nums) == 0:
return 0
if len(nums) == 1:
return nums[0]
if len(nums) == 2:
return max(nums)
nums[1] = max(nums[0], nums[1])
for i in range(2, len(nums)):
nums[i] = max(nums[i-2]+nums[i], nums[i-1])
return nums[-1]