I
如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
public int rob(int[] nums) {
int[]dp=new int[nums.length];
dp[0]=nums[0];
if(nums.length==1)return dp[0];
dp[1]=Math.max(nums[0],nums[1]);
for(int i=2;i<nums.length;i++){
dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[nums.length-1];
}
II
房子围个圈放
public int rob(int[] nums) {
if(nums.length==0)return 0;
if(nums.length==1)return nums[0];
if(nums.length==2)return Math.max(nums[1],nums[0]);
return Math.max(fun(nums,0),fun(nums,1));
}
public int fun(int[] nums,int index){
int[]dp=new int[nums.length-1];
dp[0]=nums[index];
dp[1]=Math.max(nums[index+1],nums[index]);
for(int i=2;i<nums.length-1;i++){
dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i+index]);
}
return dp[nums.length-2];
}
III
所有房屋的排列类似于一棵二叉树
public int rob(TreeNode root) {
int []res=fun(root);
return Math.max(res[0],res[1]);
}
public int[] fun(TreeNode root){
int []res=new int[2];
if(root==null)return res;
int []left=fun(root.left);
int []right=fun(root.right);
res[0]=Math.max(left[0],left[1])+Math.max(right[0],right[1]);
res[1]=left[0]+right[0]+root.val;
return res;
}