动态规划:dp[][0],dp[][1],0表示没做这件事,1表示做了。
dp[i][0]表示第i+1家(i从0开始)没偷,那么第i家偷没偷都可以,所以dp[i][0] = Max(dp[i-1][0],dp[i-1][1])。
dp[i][1]表示第i+1家偷了,所以上一家肯定没偷,即dp[i][1] = dp[i-1][0] + nums[i];
然后取两者最大值。代码:
class Solution { public int rob(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int [][]dp = new int [nums.length][2]; dp[0][0] = 0; dp[0][1] = nums[0]; int Money = 0; for (int i = 1; i < nums.length; i++) { dp[i][0] = Math.max(dp[i-1][1],dp[i-1][0]); dp[i][1] = dp[i-1][0] + nums[i]; } Money = Math.max(dp[nums.length - 1][0], dp[nums.length - 1][1]); return Money; } }
同样,因为每次计算结果只与上一家有关,之前的二维数组的值(即上上家之前的)用不到了,所以可以用两个变量代替dp[i][0]和dp[i][1]。不用用二维数组了,能省空间。
class Solution { public int rob(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int dp0,dp1; dp0 = 0; dp1 = nums[0]; for (int i = 1; i < nums.length; i++) { int temp = dp0; dp0 = Math.max(dp0,dp1); dp1 = temp + nums[i]; } return Math.max(dp0, dp1); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)