LeetCode198——house robber(不懂dp)
这题,是不能连续抢两间相邻的店铺。我不知道是不是一个环,姑且算作不是一个环。
如果你已经来到了第n间店铺,那么你有两个选择。
1.抢:sum[n] = sum[n - 2] +n.value 。第n - 1不能抢
2.不抢:你的总收益来到前面一家店的收益总和sum[n] =sum[n - 1]。
所以!我们只需要比较这两者的大小,就可以得出我们的最佳选择是什么了。
为了方便理解,假设a,b,c三间店铺。你来到了c店铺,c店铺不抢的话,你应该在a,b店铺中找一个最大的来抢。c抢的话,那么就是a + c两者之和。需要比较a,b中大的和a + c的和谁大。
同理,如果将通常情况分为n-2,n-1,n三个店铺。那么你来到n你抢n则是n-2 + n,不抢的话则应该在n-2和n-1两种解决方式之中找寻最大的方式来抢。
class Solution { public: int rob(vector<int>& nums) { if(nums.size() == 0) { return 0; } else if(nums.size() == 1) { return nums[0]; } else if(nums.size() == 2) { return max(nums[0],nums[1]); } int n1 = nums[0]; int n2 = max(nums[0],nums[1]); for(int i = 2;i != nums.size();++ i) { int n = n1 + nums[i];//第一次是第三间铺子 int n3 = n > n2 ? n : n2;//第三间铺子抢不抢?抢就是n,不抢就是n2; n1 = n2; n2 = n3; } return max(n1,n2); } };