leetcode-dp-337


/**
 * <p>小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为<meta charset="UTF-8" />&nbsp;<code>root</code>&nbsp;。</p>
 *
 * <p>除了<meta charset="UTF-8" />&nbsp;<code>root</code>&nbsp;之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 <strong>两个直接相连的房子在同一天晚上被打劫</strong> ,房屋将自动报警。</p>
 *
 * <p>给定二叉树的&nbsp;<code>root</code>&nbsp;。返回&nbsp;<em><strong>在不触动警报的情况下</strong>&nbsp;,小偷能够盗取的最高金额</em>&nbsp;。</p>
 *
 * <p>&nbsp;</p>
 *
 * <p><strong>示例 1:</strong></p>
 *
 * <p><img alt="" src="https://assets.leetcode.com/uploads/2021/03/10/rob1-tree.jpg" /></p>
 *
 * <pre>
 * <strong>输入: </strong>root = [3,2,3,null,3,null,1]
 * <strong>输出:</strong> 7
 * <strong>解释:</strong>&nbsp;小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7</pre>
 *
 * <p><strong>示例 2:</strong></p>
 *
 * <p><img alt="" src="https://assets.leetcode.com/uploads/2021/03/10/rob2-tree.jpg" /></p>
 *
 * <pre>
 * <strong>输入: </strong>root = [3,4,5,1,3,null,1]
 * <strong>输出:</strong> 9
 * <strong>解释:</strong>&nbsp;小偷一晚能够盗取的最高金额 4 + 5 = 9
 * </pre>
 *
 * <p>&nbsp;</p>
 *
 * <p><strong>提示:</strong></p>
 *
 * <p><meta charset="UTF-8" /></p>
 *
 * <ul>
 * <li>树的节点数在&nbsp;<code>[1, 10<sup>4</sup>]</code> 范围内</li>
 * <li><code>0 &lt;= Node.val &lt;= 10<sup>4</sup></code></li>
 * </ul>
 * <div><div>Related Topics</div><div><li>树</li><li>深度优先搜索</li><li>动态规划</li><li>二叉树</li></div></div><br><div><li>👍 1369</li><li>👎 0</li></div>
 */

//leetcode submit region begin(Prohibit modification and deletion)

import java.util.HashMap;

/**
 * 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 {
        Map<TreeNode, Integer> memo = new HashMap<>();
    //二叉树遍历 每个节点抢活着不抢
    public int rob(TreeNode root) {
        if (root == null) return 0;
        // 利用备忘录消除重叠子问题
        if (memo.containsKey(root))
            return memo.get(root);
        // 抢,然后去下下家
        int do_it = root.val
                + (root.left == null ?
                0 : rob(root.left.left) + rob(root.left.right))
                + (root.right == null ?
                0 : rob(root.right.left) + rob(root.right.right));
        // 不抢,然后去下家
        int not_do = rob(root.left) + rob(root.right);

        int res = Math.max(do_it, not_do);
        memo.put(root, res);
        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

posted @ 2022-07-21 10:35  小傻孩丶儿  阅读(22)  评论(0编辑  收藏  举报