你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素 
就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报 
警。 
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷 
窃到的最高金额。 
输入:[1,2,3,1] 输出:4输入:[2,7,9,3,1] 输出:12
static int maxMoney(int[] nums, int index) {if ((nums == null) || (index < 0)) {return 0;}if (index == 0) {return nums[0];}return Math.max(maxMoney(nums, index - 2) + nums[index],maxMoney(nums, index - 1));}static int maxMoney(int[] nums) {if ((nums == null) || (nums.length == 0)) {return 0;}int length = nums.length;if (length == 1) {return nums[0];} /*int[] dp = new int[length]; dp[0] = nums[0]; dp[1] = Math.max(nums[0], nums[1]); for (int i = 2; i < length; i++) { dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]); }return dp[length - 1];*/int first = nums[0];int second = Math.max(nums[0], nums[1]);for (int i = 2; i < length; i++) {int temp = second;second = Math.max(first + nums[i], second);first = temp;}return second;}
如果房子首尾相连:
public int rob(int[] nums) {int length = nums.length;if (length == 1) {return nums[0];} else if (length == 2) {return Math.max(nums[0], nums[1]);}return Math.max(robRange(nums, 0, length - 2),robRange(nums, 1, length - 1));}public int robRange(int[] nums, int start, int end) {int first = nums[start];int second = Math.max(nums[start], nums[start + 1]);for (int i = start + 2; i <= end; i++) {int temp = second;second = Math.max(first + nums[i], second);first = temp;}return second;}
public int rob(TreeNode root) {int[] rootStatus = dfs(root);return Math.max(rootStatus[0], rootStatus[1]);}public int[] dfs(TreeNode node) {if (node == null) {return new int[] { 0, 0 };}int[] l = dfs(node.left);int[] r = dfs(node.right);int selected = node.val + l[1] + r[1];int notSelected = Math.max(l[0], l[1]) + Math.max(r[0], r[1]);return new int[] { selected, notSelected };}
