class Solution {
public:
 /*
  有三种情况:偷第一家不偷最后一家;偷最后一家不偷第一家;首末两家都不偷;
  动态规划进行, 分两种情况求解, 第三种情况包含
*/
    int rob(vector<int>& nums) {
       vector<int> dp(nums.size()+1, 0);

        int res =nums[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] );
            res = max(res, dp[i]);
       }

       dp.clear();
       dp[0] = 0, dp[1] = 0;  //第一家不偷
        for(int i=2; i<=nums.size(); i++){
            dp[i] = max( dp[i-1], dp[i-2]+nums[i-1]);
            res = max(res, dp[i]);
        }

       return res;
    }
};