leetcode 抢房子House Robber

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

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);}

你可能感兴趣的:(leetcode 抢房子House Robber)