198 House Rober
方法一)自顶向下的递归
class Solution { private: //记录 memo[i]表示——抢劫[i....nums.size()-1]所能获取的最大收益 vector<int> memo; //考虑去抢劫[index....nums.size()-1]这个范围内所有的房子,返回值——抢劫[index....nums.size()-1]所能获取的最大收益 int tryRob(vector<int> &nums, int index) { if (index >= nums.size()) return 0; if (memo[index] != -1) return memo[index]; int res = 0; for (int i = index; i < nums.size(); i++) { res=max(res,nums[i] + tryRob(nums, i + 2)); } memo[index] = res; return res; } public: int rob(vector<int>& nums) { memo = vector<int>(nums.size(), -1); return tryRob(nums, 0); } };
方法二)用自底向上的动态规划
int rob(vector<int>& nums) { int n = nums.size(); if (n == 0) return 0; // memo[i]表示——抢劫[i....n-1]所能获取的最大收益 vector<int> memo(n, -1); memo[n - 1] = nums[n - 1]; for (int i = n - 2; i >= 0; i--) { for (int j = i; j < n; j++) memo[i] = max(memo[i], nums[j] +(j+2<n? memo[j + 2]:0)); } return memo[0]; }
213
.
House Robber
这道题是前一道题的升级版
假设最后一个房间和第一个房间也是邻居
class Solution { private: public: int rob(vector<int>& nums) { int n = nums.size(); if (n == 0) return 0; if (n == 1) return nums[0]; if (n == 2) return max(nums[0], nums[1]); // memo[i]表示——抢劫[i....n-1]所能获取的最大收益 //抢劫[1......n-1] vector<int> memo(n, -1); memo[n - 1] = nums[n - 1]; for (int i = n - 2; i >= 1; i--) { for (int j = i; j < n; j++) memo[i] = max(memo[i], nums[j] +(j+2<n? memo[j + 2]:0)); } //抢劫[0......n-2] vector<int> memo1(n, -1); memo1[n - 2] = nums[n - 2]; for (int i = n - 3; i >= 0; i--) { for (int j = i; j < n-1; j++) memo1[i] = max(memo1[i], nums[j] + (j + 2<n-1 ? memo1[j + 2] : 0)); } for (int i = 0; i < memo1.size(); i++) cout << memo1[i] << " "; cout << endl; cout << memo[1] << " " << memo1[0] << endl; return max(memo[1],memo1[0]); } };