public int rob(int[] nums) {int[] dp = new int[nums.length];if(nums==null||nums.length==0){return 0;}if(nums.length==1){return nums[0];}if(nums.length==2){return Math.max(nums[0],nums[1]);}dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);for(int i=2;idp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);}return dp[nums.length-1];}
对于 0-i,可以先偷 a=【0,i-1】,再头 b=【1,i】
if a =b,说明第一个和最后一个都没有偷,加上两端的一个最大值,这句话不对,如果加上最大值,例如加上最后一个,但是倒数第二个偷了,会出发报警,所以直接返回a,b最大值就行否则,直接返回a,b之间的最大值
class Solution {public int rob(int[] nums) {int[] dp1 = new int[nums.length];int[] dp2 = new int[nums.length];if(nums==null||nums.length==0){return 0;}if(nums.length==1){return nums[0];}if(nums.length==2){return Math.max(nums[0],nums[1]);}dp1[0]=nums[0];dp1[1]=Math.max(nums[0],nums[1]);dp2[1]=nums[1];dp2[2]=Math.max(nums[1],nums[2]);for(int i=2;idp1[i]=Math.max(dp1[i-1],dp1[i-2]+nums[i]);}for(int i=3;idp2[i]=Math.max(dp2[i-1],dp2[i-2]+nums[i]);}boolean b = dp1[nums.length - 2] == dp2[nums.length - 1];// if (nums.length>3&&b){// return dp2[nums.length - 1]+Math.max(nums[0],nums[nums.length-1]);// }return Math.max(dp1[nums.length - 2] , dp2[nums.length - 1]);}
}
本题是树形dp
public int rob(TreeNode root) {int[] ints = robDG(root);return Math.max(ints[0],ints[1]);}public int[] robDG(TreeNode root) {if (root==null){return new int[]{0,0}; }int[] left = robDG(root.left);int[] right = robDG(root.right);return new int[]{Math.max(left[0],left[1])+Math.max(right[0],right[1]),left[0]+right[0]+root.val};}
上一篇: 致老师的诗歌(模板)5篇