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]);
}
};