class Solution {
public:
int rob(vector<int>& nums) {
//dp[i]表示长度为i+1的数组,最多能偷取多少钱
vector<int> dp(nums.size(), 0);
//选择偷了第一家
dp[0] = nums[0];
//最后一家不能偷
for(int i = 1; i < nums.size(); i++)
{
if(i==1)
dp[i] = max(dp[i - 1], nums[i]);
else
//对于每家可以选择偷或者不偷
dp[i] = max(dp[i - 1], nums[i] + dp[i - 2]);
}
//最后一家不能偷
int res = dp[nums.size() - 2];
//清除dp数组,第二次循环
dp.clear();
//不偷第一家
dp[0] = 0;
//可以偷最后一家
for(int i = 1; i < nums.size(); i++)
{
if(i==1)
dp[i] = nums[i];
else
//对于每家可以选择偷或者不偷
dp[i] = max(dp[i - 1], nums[i] + dp[i - 2]);
}
//选择最大值
return max(res, dp[nums.size()-1]);
}
};
// #include <vector>
// class Solution {
// public:
// /**
// * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
// *
// *
// * @param nums int整型vector
// * @return int整型
// */
// int rob(vector<int>& nums) {
// // write code here
// // 与打家劫舍(一)不同,该题每个房间都可能是第一家被偷的存在
// int n = nums.size();
// int ans = 0;
// if(n==0)
// return 0;
// // i 为第一家被偷的房间
// for(int i=0; i<n; ++i)
// {
// vector<int> dp(n-1,0);
// // 最后一家和第一家是相邻的,所以算了第一家,就不算最后一家了
// for(int j=i; j-i<n-1; ++j)
// {
// if(j==i)
// dp[0] = nums[i];
// else if(j==i+1)
// dp[1] = max(dp[0],nums[j%n]);
// else
// dp[j-i] = max(dp[j-i-1],dp[j-i-2]+nums[j%n]);
// }
// ans = max(ans,dp[n-2]);
// }
// return ans;
// }
// };