class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int max(int a, int b){
        return a>b?a:b;
    }
    int rob(vector<int>& nums) {
        int n = nums.size();
         

        //res1 不偷第一家的情况
        vector<int> dp1(n+1,0);dp1[1] = 0;
        for(int i = 2  ; i <= n ;i++ ){  
            dp1[i] =  max(dp1[i-1],dp1[i-2]+nums[i-1] );
        }
        int res1 = dp1[n];


        //res2 偷第一家的情况
        vector<int> dp2(n,0);
        dp2[1] = nums[0];
        for(int i = 2  ; i < n ;i++ ){  
            dp2[i] =  max(dp2[i-1],dp2[i-2]+nums[i-1] );
        }
        int res2 = dp2[n-1];

        return max(res1,res2);

    }
};

一位dp中等题,对于这种环形问题,可以拆分成2 个方向,一个是要第一个,另一个是不要第一个,拆分成2个来分别动态规划