打家劫舍
核心思路
-
dp[i][0]: 打劫i 能得到的最大金额
-
dp[i][1]: 不打劫i 能得到的最大金额
-
推导
- 打劫i, 能得到的最大金额, 一定是i-1[1] + nums[i]
- 不打劫i, 能得到的最大金额, 那偷上一家和不偷上一家都可以, 所以要取i-1最大的那个数
javapublic int rob(int[] nums) { int[][] dp = new int[nums.length][2]; //dp[i][0]: 偷i的金额 = [i - 1][1] + nums[i] //dp[i][1]: 不偷i的金额 = [i - 1][0] dp[0][0] = nums[0]; dp[0][1] = 0; for (int i = 1; i < nums.length; i++) { dp[i][0] = dp[i - 1][1] + nums[i]; dp[i][1] = Math.max(dp[i - 1][0],dp[i - 1][1]); } return Math.max(dp[nums.length - 1][0],dp[nums.length - 1][1]); }
思路2
-
一维数组
- 如果打劫i, 那么i的值就是dp[i-2]+nums[i]
- 如果不打劫i, 那么i的值就等于dp[i-1]
- 取最大值
javapublic int rob1(int[] nums) { if(nums.length == 1){ return nums[0]; } if(nums.length == 2){ return Math.max(nums[0],nums[1]); } int[] dp = new int[nums.length]; dp[0] = nums[0]; dp[1] = Math.max(nums[0],nums[1]); for (int i = 2; i < nums.length; i++) { dp[i] = Math.max(dp[i - 2] + nums[i],dp[i - 1]); } return dp[nums.length - 1]; }