动态规划算法,要理清楚最优子结构,还有最大利润和存储数组之间的关系。
内存开销为O(n)
int rob(int* nums, int numsSize){
if(numsSize == 1) return nums[0];
if(numsSize == 2) return nums[0] > nums[1] ? nums[0] : nums[1];
int a[numsSize];
a[0] = nums[0];
a[1] = nums[1];
a[2] = nums[0] + nums[2];
int i, max;
for(i = 3; i < numsSize; ++i){
a[i] = (a[i-3] > a[i-2] ? a[i-3] : a[i-2]) + nums[i];
}
max = a[numsSize-1] > a[numsSize-2] ? a[numsSize-1] : a[numsSize-2];
return max;
}
用上滚动数组:
int rob(int* nums, int numsSize){
if(numsSize == 1) return nums[0];
if(numsSize == 2) return nums[0] > nums[1] ? nums[0] : nums[1];
if(numsSize == 3) return nums[0] + nums[2] > nums[1] ? nums[0] + nums[2] : nums[1];
int a[4] = {0};
a[0] = nums[0];
a[1] = nums[1];
a[2] = nums[0] + nums[2];
int i, max;
for(i = 3; i < numsSize; ++i){
a[3] = (a[0] > a[1] ? a[0] : a[1]) + nums[i];
a[0] = a[1];
a[1] = a[2];
a[2] = a[3];
}
max = a[3] > a[1] ? a[3] : a[1];
return max;
}
内存开销为O(1)
似乎内存占用没有减少很多。。。但是理论上是占用得更少的啊。