Problem
Hint
Using Dynamic Programming.
Code
int rob(int* nums, int numsSize) {
if(numsSize == 0)
return 0;
else if(numsSize == 1)
return nums[0];
int res[numsSize];
res[0] = nums[0];
res[1] = nums[1]>nums[0]?nums[1]:nums[0];
int i = 2;
while(i<numsSize){
//This is important
res[i] = (res[i-2]+nums[i]>res[i-1]?res[i-2]+nums[i]:res[i-1]);
++i;
}
return res[numsSize-1];
}
Problem
Hint
Use House Robber ‘s solution.You can guess there are two results.One is the first house will be robbered.Another is the first house will not be robbered.And you can pick the bigger one as final result.
Code
int rob(int* nums, int numsSize) {
if(numsSize==0) return 0;
else if(numsSize==1) return nums[0];
int res[numsSize];
int max;
//必选nums[0]
res[0]=nums[0];
res[1]=nums[0];
int i = 2;
while(i<numsSize){
res[i] = res[i-2]+nums[i]>res[i-1]?res[i-2]+nums[i]:res[i-1];
++i;
}
if(res[numsSize-1]==res[numsSize-2])
max = res[numsSize-1];
else
max = res[numsSize-2];
//必不选nums[0]
i = 2;
res[0]=0;
res[1]=nums[1];
while(i<numsSize){
res[i] = res[i-2]+nums[i]>res[i-1]?res[i-2]+nums[i]:res[i-1];
++i;
}
return max>res[numsSize-1]?max:res[numsSize-1];
}