目录
一、198.打家劫舍题目
二、代码
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
if(n==1)
return nums[0];
if(n==2)
return nums[0]>nums[1]?nums[0]:nums[1];
vector<int>dp(n,0);
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<n;i++)
{
dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[n-1];
}
};
三、213.打家劫舍II题目
四、代码
通过分类讨论将环形问题,转化成两个线性的“打家劫舍”
class Solution {
public:
int rob_2(vector<int>&nums,int left,int right)
{
//198.打家劫舍
if(left>right)
return 0;
int n=right-left+1;
if(n==1)
return nums[left];
if(n==2)
return max(nums[left],nums[left+1]);
vector<int>dp(n+left,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(dp[i-1],dp[i-2]+nums[i]);
}
return dp[right];
}
int rob(vector<int>& nums)
{
int n=nums.size();
if(n==1)
return nums[0];
if(n==2)
return max(nums[0],nums[1]);
//不考虑最后一个房间(偷第一个房间)------偷窃0到n-2
//不考虑第一个房间(不偷第一个房间)--------偷窃1到n-1
int ret1=rob_2(nums,0,n-2);
int ret2=rob_2(nums,1,n-1);
return max(ret1,ret2);
}
};