class Solution {
public int rob(int[] nums) {
if(nums.length==1){
return nums[0];
}
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-1],dp[i-2]+nums[i]);
}
return dp[nums.length-1];
}
}
确实不算很难,唯一要注意的就是dp【1】的初始化。
卡尔的这句话非常耐人寻味:注意这里是考虑,并不是一定要偷i-1房,这是很多同学容易混淆的点
337.打家劫舍 III
int value1 = head.val+dp1[0]+dp2[0];//犹豫了
你不能只考虑一个分支,两个分支都不抢是一种状态,都要把钱加进去。
// int value2 = Math.max(dp1[1],dp2[1]);错了
跟上面一样的问题既然是抢,那么两个分支都要加进去,左面有抢和不抢两种状态,右面也有抢和不抢两种状态。都要加!
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int rob(TreeNode root) {
TreeNode head = root;
// int[] dp = new int[2];
int[] dp = robb(head);
return Math.max(dp[0],dp[1]);
}
public int[] robb(TreeNode head){
if(head==null){
return new int[]{0,0};
}
int[] dp1 = robb(head.left);
int[] dp2 = robb(head.right);
int value1 = head.val+dp1[0]+dp2[0];//犹豫了
// int value2 = Math.max(dp1[1],dp2[1]);错了
int value2 = Math.max(dp1[0],dp1[1])+Math.max(dp2[0],dp2[1]);
//return new int[]{value1,value2};错了
return new int[]{value2,value1};
}
}