1 static int wing=[]() 2 { 3 std::ios::sync_with_stdio(false); 4 cin.tie(NULL); 5 return 0; 6 }(); 7 8 class Solution 9 { 10 public: 11 int rob(vector<int>& nums) 12 { 13 int sz=nums.size(); 14 if(sz==0) 15 return 0; 16 if(sz==1) 17 return nums[0]; 18 if(sz==2) 19 return max(nums[0],nums[1]); 20 vector<int> vi(sz,0); 21 vi[0]=nums[0]; 22 vi[1]=max(nums[0],nums[1]); 23 for(int i=2;i<sz;i++) 24 { 25 int cur=nums[i]+vi[i-2]; 26 vi[i]=max(cur,vi[i-1]); 27 } 28 return vi[sz-1]; 29 } 30 };
可以构建一个新的容器,也可以不构建,转而使用几个变量来替代。
上面那个是新建一个辅助容器的方法,根据当前房屋抢与不抢,将当前抢劫所能获得的最大值放在辅助容器相应位置。辅助容器的最后那个元素即为抢劫最大获利。
1 static int wing=[]() 2 { 3 std::ios::sync_with_stdio(false); 4 cin.tie(NULL); 5 return 0; 6 }(); 7 8 class Solution 9 { 10 public: 11 int rob(vector<int>& nums) 12 { 13 int sz=nums.size(); 14 int robMax=0,skipMax=0; 15 int rr=0,ss=0; 16 for(int i:nums) 17 { 18 rr=robMax,ss=skipMax; 19 robMax=ss+i; 20 skipMax=max(rr,ss); 21 } 22 return max(robMax,skipMax); 23 } 24 };
以上是不用辅助容器的方法。
四个变量,抢本次,不抢本次,抢上一次,不抢上一次。
初始时四个变量全为0。每次遇到新的一家,将抢上次的值置为抢当前值,不抢上次的值置为不抢当前值。
然后抢当前值置为不抢上次与本房间财产之和,不抢当前值置为抢上次和不抢上次两者中的最大值。
循环到最后,抢本次和不抢本次之中的最大值即为本次抢劫最大获利。