<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