第一道DP题。
主要是要判断当n=0,1,2的特殊情况。
打家劫舍2则是“断”掉圈,分别考虑不选第一个和不选最后一个的情况。
//打家劫舍1
class Solution {
public:
int rob(vector<int>& num) {
int n=num.size();
int opt[n+5]={0};
if (n>2)
{opt[0]=num[0];
opt[1]=num[1]>num[0]?num[1]:num[0];
for(int i=2;i<n;i++)
{
int a=opt[i-1];
int b=opt[i-2]+num[i];
if(a>b)
opt[i]=a;
else
opt[i]=b;
}
return opt[n-1];
}
else if(n==2)
return num[1]>num[0]?num[1]:num[0];
else if(n==1)
return num[0];
else
return 0;
}
};
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
int opt[n+5];
if(n==2)
return nums[1]>nums[0]?nums[1]:nums[0];
if(n==1)
return nums[0];
if(n==0)
return 0;
if(n==3)
{
int max=0;
for(int i=0;i<3;i++)
if(max<nums[i])
max=nums[i];
return max;
}
if(n>3)
{
int n=nums.size();
int opt[n+5];
opt[0]=nums[0];
opt[1]=nums[1]>nums[0]?nums[1]:nums[0];
int first=0,se=0;
for(int i=2;i<n-1;i++)
{
int a=opt[i-1];
int b=opt[i-2]+nums[i];
if(a>b)
opt[i]=a;
else
opt[i]=b;
}
first=opt[n-2];
opt[1]=nums[1];
opt[2]=nums[2]>nums[1]?nums[2]:nums[1];
for(int i=3;i<n;i++)
{
int a=opt[i-1];
int b=opt[i-2]+nums[i];
if(a>b)
opt[i]=a;
else
opt[i]=b;
}
se=opt[n-1];
return first>se?first:se;
}
}
};