213.打家劫舍II
Python
class Solution:
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums)<=1:
if len(nums)==0:
return 0
else:
return nums[0]
if len(nums)<=2:
return max(nums)
dp1=[nums[0],max(nums[0],nums[1])]
for i in range(2,len(nums)-1):
dp1.append(max(nums[i]+dp1[i-2],dp1[i-1]))
dp2=[nums[0],nums[1],max(nums[1],nums[2])]
for i in range(3,len(nums)):
dp2.append(max(nums[i]+dp2[i-2],dp2[i-1]))
return max(dp1[-1],dp2[-1])
C++
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.empty())
return 0;
if (nums.size()==1)
return nums[0];
if (nums.size()<=3)
return *max_element(nums.begin(),nums.end());
//从第一个元素开始做动态规划
vector<int>dp1={nums[0],max(nums[0],nums[1])};
for (int i = 2; i <nums.size()-1; ++i) {
dp1.push_back(max(dp1[i-2]+nums[i],dp1[i-1]));
}
//从第二个元素开始做动态规划
vector<int>dp2={nums[0],nums[1],max(nums[1],nums[2])};
for (int j = 3; j <nums.size() ; ++j) {
dp2.push_back(max(dp2[j-2]+nums[j],dp2[j-1]));
}
return max(dp1.back(),dp2.back());
}
};