这个题我没有用动态规划。我是这样想的:
假设每一家的钱nums是:5 1 7 3 2 4.
我定义一个新的数组vector<int> tmp(nums.size()),令dp[i]的含义是,抢劫nums[i]这一家的话能得到的最大收益。那么这个题的答案就是这个数组里最大的那个数。我的代码:
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]); vector<int> tmp(nums.size()); tmp[0] = nums[0]; tmp[1] = max(nums[0], nums[1]); int maxnum = tmp[0]; //这里存的是[0~i-2]这个区间的最大值 for(int i = 2; i < nums.size(); ++i) { tmp[i] = nums[i] + maxnum; //i家的钱数+[0~i-2]这些家的最大收益
if(tmp[i - 1] > maxnum) maxnum = tmp[i - 1]; } return max(maxnum, tmp[nums.size() - 1]); }}; 写完之后一想,为什么我不让我的数组tmp[i]的含义是:如果只有0-i家人,最大收益是多少。这样更直接,tmp[i]就是答案了。改了一下://下面比较[0~i-1]的最大收益和[0~i-2]最大收益哪个更大。 //在这个地方比较,是因为,如果放在前面比较的话,上一条语句中的maxnum可能是[0~i-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]); vector<int> tmp(nums.size()); tmp[0] = nums[0]; tmp[1] = max(nums[0], nums[1]); int maxnum = tmp[0]; for(int i = 2; i < nums.size(); ++i) { tmp[i] = max(tmp[i - 1], tmp[i - 2] + nums[i]); } return tmp[nums.size() - 1]; } };