打家劫舍(二)_牛客题霸_牛客网 (nowcoder.com)
这里加了一个头尾相接的条件,偷了头部,尾部就不应该被偷了
偷了尾部,头部就不可以被偷了
分成两种情况分析,偷第一家和不偷第一家的然后比较
class Solution {
public:
int rob(vector<int>& nums) {
//dp[i]表示长度为i的数组,最多能偷取多少钱
vector<int> dp(nums.size() + 1, 0);
//选择偷了第一家
dp[1] = nums[0];
//最后一家不能偷
for (int i = 2; i < nums.size(); i++)
//对于每家可以选择偷或者不偷
dp[i] = max(dp[i - 1], nums[i - 1] + dp[i - 2]);
int res = dp[nums.size() - 1];
//清除dp数组,第二次循环
dp.clear();
//不偷第一家
dp[1] = 0;
//可以偷最后一家
for (int i = 2; i <= nums.size(); i++)
//对于每家可以选择偷或者不偷
dp[i] = max(dp[i - 1], nums[i - 1] + dp[i - 2]);
//选择最大值
return max(res, dp[nums.size()]);
}
};