思路:考虑三种情况注释代码中
class Solution { public: int rob(vector<int>& nums) { if(nums.empty()) return 0; if(nums.size()==1) return nums[0]; //考虑首端,不考虑尾端 int value1 = robrange(nums,0,nums.size()-2); //考虑尾端,不考虑首端 int value2 = robrange(nums,1,nums.size()-1); return max(value1,value2); } //考虑以下三种情况 //1:不考虑首尾的情况 //2:考虑首端情况 //3:考虑尾端情况 //由于情况1包含在情况2,3中,所以只要考虑后面两个即可 int robrange(vector<int>& nums,int start,int end){ if (end == start) return nums[start]; vector<int> dp(nums.size(),0); //第i个房间最高金额是dp[i] dp[start] = nums[start]; dp[start+1] = max(nums[start],nums[start+1]); for(int i=start+2;i<=end;i++){ dp[i] = max(nums[i]+dp[i-2],dp[i-1]); } return dp[end]; } };