思路
-
dp数组定义:考虑0 - i的房屋,不触动报警下,最大金额是dp[i],在此基础上分为不考虑头和不考虑尾
-
递推公式:
cppdp[i] = max(dp[i-1], dp[i-2]+nums[i]);
重点是划分成两种情况,由于首尾相连,所以可以不考虑尾或者不考虑首来满足首尾相邻的条件
-
dp数组初始化:
cppdp[start] = nums[start]; dp[start + 1] = max(nums[start], nums[start + 1]);
-
遍历顺序:顺序
-
时间复杂度:
代码
cpp
class Solution {
public:
int robInRange(vector<int>& nums, int start, int end){
if(start == end) return nums[start];
vector<int> dp(nums.size());
dp[start] = nums[start];
dp[start + 1] = max(nums[start], nums[start + 1]);
for(int i = start + 2; i <= end; i++){
dp[i] = max(dp[i-1], dp[i-2]+nums[i]);
}
return dp[end];
}
int rob(vector<int>& nums) {
if(nums.size() == 0) return 0;
if(nums.size() == 1) return nums[0];
int r1 = robInRange(nums, 0, nums.size()-2);
int r2 = robInRange(nums, 1, nums.size() - 1);
return max(r1, r2);
}
};