做出来了,但是没想到封装成一个函数,造成了代码的冗余
class Solution {
public:
int rob(vector<int>& nums) {
// 和之前的区别在于 这里的第一个房子和最后一个房子是连着的
// 需要单独考虑吗
if(nums.size() == 1)
return nums[0];
if(nums.size() == 2)
return max(nums[0], nums[1]);
vector<int> dp(nums.size(), 0);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for(int i = 2; i <= nums.size() - 2; i++)
{
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
}
int res = dp[nums.size() - 2];
// 注意这里下标
dp[1] = nums[1];
dp[2] = max(nums[1], nums[2]);
for(int i = 3; i <= nums.size() - 1; i++)
{
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
cout << dp[i] << endl;
}
res = max(res, dp[nums.size() - 1]);
return res;
}
};
做成函数的版本:
class Solution {
public:
int robrange(vector<int>& nums, int start, int end)
{
// 表示 大小为 1
if(start == end) return nums[start];
vector<int> dp(nums.size());
// 注意下标
dp[start] = nums[start];
dp[start + 1] = max(nums[start + 1], nums[start]);
// 注意下标 start + 2
for(int i = start + 2; i <= end; i++)
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
return dp[end];
}
int rob(vector<int>& nums) {
if(nums.size() == 1 )
return nums[0];
int res1 = robrange(nums, 0, nums.size() - 2);
int res2 = robrange(nums, 1 , nums.size() - 1);
return max(res1, res2);
}
};