DP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public int rob(int[] nums) { if (nums.length == 1) { return nums[0]; }
int n = nums.length;
int[][] dp = new int[n][2]; dp[0][0] = 0; dp[1][0] = nums[1];
dp[0][1] = nums[0]; dp[1][1] = nums[0];
for (int i = 2; i < n; i++) { dp[i][0] = Math.max(nums[i] + dp[i - 2][0], dp[i - 1][0]); dp[i][1] = Math.max(nums[i] + dp[i - 2][1], dp[i - 1][1]); }
return Math.max(dp[n - 1][0], dp[n - 2][1]); } }
|
DP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public int rob(int[] nums) { int n = nums.length;
if (n == 1) { return nums[0]; }
return Math.max(rob(nums, 0, n - 2), rob(nums, 1, n - 1)); }
private int rob(int[] nums, int start, int end) { if (start == end) { return nums[start]; } if (start + 1 == end) { return Math.max(nums[start], nums[start + 1]); }
int[] dp = new int[end - start + 1]; dp[0] = nums[start]; dp[1] = Math.max(nums[start], nums[start + 1]);
for (int i = 2; i < dp.length; i++) { dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[start + i]); }
return dp[dp.length - 1]; } }
|
References
213. House Robber II
剑指 Offer II 090. 环形房屋偷盗