<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed(藏着), </span>
Hide Tags: Dynamic Programming
解题思路:
思路一:A[i][0]表示第i次没有抢劫,A[i][1]表示第i次进行了抢劫,即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].实际上只需要两个变量保存结果就可以了,不需要用二维数组
思路二:找到递推关系:maxV[i] = max(maxV[i-2]+num[i], maxV[i-1])
代码一:
/**
* 这是一个DP(Dynamic Programming:动态规划)问题
* A[i][0]表示第i次没有抢劫,A[i][1]表示第i次进行了抢劫
* 即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]
* 实际上只需要两个变量保存结果就可以了,不需要用二维数组
*/
public static int rob(int[] nums)
{
int norobcurHouse=0; //表示没有抢当前House的总金额
int robcurHouse=0; //表示抢了当前House的总金额
for (int i = 0; i < nums.length; i++)
{
//设置中间变量,暂时存储
int temp=norobcurHouse;
//没有选择当前houses,那么它等于上次选择了或没选择的最大值
norobcurHouse=Math.max(norobcurHouse, robcurHouse);
//选择了当前houses,值只能等于上次没选择的+当前houses的money
robcurHouse=temp+nums[i];
}
return Math.max(norobcurHouse, robcurHouse);
}代码二:
/**
* 递推关系为maxV[i] = max(maxV[i-2]+num[i], maxV[i-1])
*/
public static int rob1(int[] nums)
{
int n=nums.length;
if (n==0)
{
return 0;
}
else if(n==1)
{
return nums[0];
}
else
{
int []maxV=new int[n];
maxV[0]=nums[0];
maxV[1]=Math.max(nums[0], nums[1]);
for (int i = 2; i < n; i++)
{
maxV[i]=Math.max(maxV[i-2]+nums[i], maxV[i-1]);
}
return maxV[n-1];
}
}
leetcode——198 House Robber(寻找数组不相邻组合最大值—动态规划问题)
原文地址:http://blog.csdn.net/zzc8265020/article/details/46519807