原题网址:https://leetcode.com/problems/house-robber-iii/
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 1:
3 / \ 2 3 \ \ 3 1Maximum amount of money the thief can rob = 3 + 3 + 1 = 7 .
Example 2:
3
/ \
4 5
/ \ \
1 3 1
Maximum amount of money the thief can rob =
4
+
5
=
9
.
方法:类似动态规划,递归遍历所有节点,返回两种结果,一种是包含本节点的最大值,另一种是不含本节点的最大值。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private int[] dp(TreeNode root) {
// money[0] root inclusive, money[1] root excluded
int[] money = new int[2];
money[0] = root.val;
if (root.left != null) {
int[] left = dp(root.left);
money[0] += left[1];
money[1] += Math.max(left[0], left[1]);
}
if (root.right != null) {
int[] right = dp(root.right);
money[0] += right[1];
money[1] += Math.max(right[0], right[1]);
}
return money;
}
public int rob(TreeNode root) {
if (root == null) return 0;
int[] money = dp(root);
return Math.max(money[0], money[1]);
}
}
另一种实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private int[] dp(TreeNode root) {
// m[0] 最大收益(无论偷还是不偷本房屋)
// m[1] 最大收益(不偷本房屋)
int[] m = new int[2];
m[0] = root.val;
if (root.left != null) {
int[] left = dp(root.left);
m[1] += left[0];
m[0] += left[1];
}
if (root.right != null) {
int[] right = dp(root.right);
m[1] += right[0];
m[0] += right[1];
}
m[0] = Math.max(m[0], m[1]);
return m;
}
public int rob(TreeNode root) {
if (root == null) return 0;
int[] m = dp(root);
return m[0];
}
}

本文探讨了LeetCode上的House Robber III问题,通过树形结构动态规划的方法,设计了一个递归算法,该算法能够计算出在不触动警报的前提下,窃贼能获取的最大金额。
890

被折叠的 条评论
为什么被折叠?



