198. House Robber

 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。每次遇到新的一家,将抢上次的值置为抢当前值,不抢上次的值置为不抢当前值。

然后抢当前值置为不抢上次与本房间财产之和,不抢当前值置为抢上次和不抢上次两者中的最大值。

循环到最后,抢本次和不抢本次之中的最大值即为本次抢劫最大获利。

猜你喜欢

转载自www.cnblogs.com/zhuangbijingdeboke/p/9072770.html