题目
house-robber/
算法
* DP
* DP优化
代码
* DP
/ DP
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.size() <= 1) return nums.empty() ? 0 : nums[0];
return max(rob(nums, 0, nums.size() - 1), rob(nums, 1, nums.size()));
}
int rob(vector<int> &nums, int left, int right) {
if (right - left <= 1) return nums[left];
vector<int> dp(right, 0);
dp[left] = nums[left];
dp[left + 1] = max(nums[left], nums[left + 1]);
for (int i = left + 2; i < right; ++i) {
dp[i] = max(nums[i] + dp[i - 2], dp[i - 1]);
}
return dp.back();
}
};
* DP优化
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.size() <= 1) return nums.empty() ? 0 : nums[0];
return max(rob(nums, 0, nums.size() - 1), rob(nums, 1, nums.size()));
}
int rob(vector<int> &nums, int left, int right) {
int a = 0, b = 0;
for (int i = left; i < right; ++i) {
int m = a, n = b;
a = n + nums[i];
b = max(m, n);
}
return max(a, b);
}
};
* 更优化
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.size() <= 1) return nums.empty() ? 0 : nums[0];
vector<int> v1 = nums, v2 = nums;
v1.erase(v1.begin()); v2.pop_back();
return max(rob_house(v1), rob_house(v2));
}
int rob_house(vector<int> &nums) {
int a = 0, b = 0;
for (int i = 0; i < nums.size(); ++i) {
if (i % 2 == 0) {
a += nums[i];
a = max(a, b);
} else {
b += nums[i];
b = max(a, b);
}
}
return max(a, b);
}
};