把循环拆成了两个队列分别解,然后返回最大值。第一次遇到这样的思路,值得学习。
依然是滚动数组动态规划。
/*dp[n] = max{dp[n-1], dp[n-2] + nums[n]}*/
int rangeRob(int* nums, int start, int end){
int i;
int a = nums[start];
int b = fmax(nums[start], nums[start+1]);
int c = 0;
if(end - start < 2) return b;
for(i = start + 2; i <= end; ++i){
c = fmax(b, a + nums[i]);
a = b;
b = c;
}
return c;
}
int rob(int* nums, int numsSize){
if(numsSize == 1) return nums[0];
if(numsSize == 2) return fmax(nums[0], nums[1]);
int c1 = rangeRob(nums, 0, numsSize-2);
int c2 = rangeRob(nums, 1, numsSize-1);
return fmax(c1, c2);
}