打家劫舍
思路(自创)
a、b、x、y分别表示偷、不偷、偷、不偷上一家上一家、本家本家得到的最大利润,如果想要偷本家,上一家一定不能偷,但是,如果不想偷本家,从上一家偷与不偷最大值转移过来,最后返回,x和y最大值
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 1) return nums[0];
int a = nums[0], b = 0;
int x = 0, y = 0;
for (int i = 1; i < n; i ++ )
{
x = nums[i] + b;
y = max(a, b);
a = x;
b = y;
}
return max(x, y);
}
};
打家劫舍2
class Solution {
public:
int get_rob(vector<int>& nums, int l, int r)
{
int pre = nums[l], cur = max(nums[l],nums[l + 1]);
for (int i = l + 2; i <= r; i ++ )
{
int t = cur;
cur = max(pre + nums[i], cur);
pre = t;
}
return cur;
}
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 1) return nums[0];
else if (n == 2) return max(nums[0], nums[1]);
else return max(get_rob(nums, 0, n - 2),get_rob(nums, 1, n - 1));
}
};
删除并获得点数
class Solution {
public:
int rob(vector<int>& nums)
{
int n = nums.size();
int pre = nums[0], cur = max(nums[1], nums[0]);
for (int i = 2; i < n; i ++ )
{
int t = cur;
cur = max(pre + nums[i], cur);
pre = t;
}
return cur;
}
int deleteAndEarn(vector<int>& nums) {
int maxval = 0;
for (int &val : nums)
maxval = max(maxval, val);
vector<int> f(maxval + 1);
for (int &t : nums)
f[t] += t;
return rob(f);
}
};