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;
//     }
// };