思路
頭尾相連意味着頭尾只能搶一個,那我們可以把搶劫的區間分成兩個,[0, n-2]和[1, n-1],分別進行dp再取最大值
和Ⅰ一樣,重點是弄明白dp[i]在這邊即dp_i的意義,是表示從第i間房子開始搶能夠得到的最大的數值
//第一個和最後一個是相鄰的,即首位不能同時被搶
class Solution {
public:
int robRange(vector<int>&nums, int start, int end)
{
int dp_i_1 = 0;//not_rober
int dp_i_2 = 0; //do_rober
int dp_i;//current house
//就跟Ⅰ一眼的動態規劃了
for(int i = end; i>= start; i--)//從這件房子開始搶
{
dp_i = max(dp_i_1, dp_i_2+nums[i]);
dp_i_2 = dp_i_1;
dp_i_1 = dp_i;
}
return dp_i;
}
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 0) return 0;
if(n == 1) return nums[0];
return max(robRange(nums, 0, n-2), robRange(nums, 1, n-1));
}
};