Description
The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.
Determine the maximum amount of money the thief can rob tonight without alerting the police.
Example
3
/ \
2 3
\ \
3 1
Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
3
/ \
4 5
/ \ \
1 3 1
Maximum amount of money the thief can rob = 4 + 5 = 9.
Solution
root点的结果基于两个状态-包含root和不包含root
包含root时,结果=(root.left不论包不包含root.left点的最大值)+(root.right不论包不包含root.right点的最大值)
不包含root时,结果=root的value + root.left上不包含root.left点的结果 + root.right上不包含root.right的结果
因此用一个长度为2的数组表示root点的结果,dp[0]表示不包含root的结果,dp[1]表示包含root的结果,得到状态方程dp[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
dp[1] = root.val + left[0] + right[0]; left上不含left的结果+right上不含right的结果
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution {
/*
* @param root: The root of binary tree.
* @return: The maximum amount of money you can rob tonight
*/
public int houseRobber3(TreeNode root) {
// write your code here
int[] dp = houseRobber3Helper(root);
return Math.max(dp[0], dp[1]);
}
private int[] houseRobber3Helper(TreeNode root) {
if (root == null) {
return new int[]{0, 0};
}
int[] left = houseRobber3Helper(root.left);
int[] right = houseRobber3Helper(root.right);
int[] dp = new int[2];
dp[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
dp[1] = root.val + left[0] + right[0];
return dp;
}
}