解题思路:这道题是“打家劫舍I”的升级版,和“打家劫舍I”的区别在于“打家劫舍II”的第一个房子和最后一个房子是相连的,这就导致不能用“打家劫舍I”的方法来解题。为了解决“打家劫舍II”中的相连问题,这里讨论两种情况,第一种情况是仅考虑第1个房子到n-1个房子能够窃取的最大的金额,第二种情况是讨论第2个房子到第n个房子能够窃取的最大的金额,然后比较两者之间的取值,返回较大的取值。其状态转移方程和“打家劫舍I”是一样的,区别在于这里讨论的是两种情况。其C++代码如下:
class Solution {
public:
int rob(vector<int>& nums) {
int length = nums.size();
if(length==0)
return 0;
if(length==1)
return nums[0];
vector<int> dp_1(length,0);
vector<int> dp_n(length,0);
dp_1[1] = nums[0];
dp_n[1] = nums[1];
int num_1 = dp_1[1];
int num_n = dp_n[1];
for(int i=1;i<length-1;i++)
{
dp_1[i+1] = max(dp_1[i],dp_1[i-1] + nums[i]);
num_1 = max(num_1,dp_1[i+1]);
}
for(int i=2;i<length;i++)
{
dp_n[i] = max(dp_n[i-1],dp_n[i-2] + nums[i]);
num_n = max(num_n,dp_n[i]);
}
return max(num_1,num_n);
}
};