【leetcode】213. House Robber II
题目如下:
解题思路:和【leetcode】198. House Robber 思路一样,也是动态规划。只不过本题新增了一个约束,就是nums[0]和nums[len(nums)-1]不能同时抢。那么我们可以分别针对nums[0]抢还是不抢这两种情况做两次动态规划。如果nums[0]抢的话,那么抢劫的区间就是nums[0]~nums[len(nums)-2];如果不抢,区间就是nums[1]~nums[len(nums)-1]。两种情况相比较取最大值就是结果。
代码如下:
class Solution(object): 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) # rob nums dp = [0 for x in nums] dp[0] = nums[0] dp[1] = max(nums[0], nums[1]) # do not rob nums[0] dp_2 = [0 for x in nums] dp_2[1] = nums[1] dp_2[2] = max(nums[1], nums[2]) for i in xrange(2,len(nums)): if i >= 2 and i < len(nums)-1: dp[i] = max(dp[i-1],dp[i-2]+nums[i]) if i >= 3 and i < len(nums): dp_2[i] = max(dp_2[i - 1], dp_2[i - 2] + nums[i]) return max(dp_2[-1],dp[-2])