Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.
这道题的本质相当于在一列数组中取出一个或多个不相邻数,使其和最大。那么我们对于这类求极值的问题首先考虑动态规划Dynamic Programming来解:
用A[0]表示没有rob当前house的最大money,A[1]表示rob了当前house的最大money,那么A[0] 等于rob或者没有rob上一次house的最大值
即A[i+1][0] = max(A[i][0], A[i][1]).. 那么rob当前的house,只能等于上次没有rob的+money[i+1], 则A[i+1][1] = A[i][0]+money[i+1].实际上只需要两个变量保存结果就可以了,不需要用二维数组:
int max1(int x,int y){ if(x>y)return x; return y;} int rob(int* nums, int numsSize) { if(numsSize<1)return 0; if(numsSize==1)return nums[0]; int old=0;//没抢当前房子的最大钱数 int now=0;//抢完当前房子的最大钱数 for(int i=0;i<numsSize;i++) {int temp=old; old=max1(old,now);//没抢之前和上一次抢完的最大 now=temp+nums[i];} return max1(old,now);}