算法——打家劫舍问题

树状排列问题
链接: leetcode.

解题思路:动态规划,利用两个哈希表,一个表示偷当前节点,另一个表示不透当前节点的最大收益。状态转移,偷当前节点的状态,由两个子节点的不偷状态加上当前节点值组成,不偷当前节点的状态,由不偷或者偷子节点的最大值转化过来。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    Map<TreeNode, Integer> f = new HashMap<>(), g = new HashMap<>();
    public int rob(TreeNode root) {
        dfs(root);

        return Math.max(f.getOrDefault(root, 0), g.getOrDefault(root, 0));
    }

    public void dfs(TreeNode root) {
        if(root == null) return;

        dfs(root.left);
        dfs(root.right);

        f.put(root, root.val + g.getOrDefault(root.left, 0) + g.getOrDefault(root.right, 0));
        g.put(root, Math.max(f.getOrDefault(root.left, 0), g.getOrDefault(root.left, 0)) + 
        Math.max(f.getOrDefault(root.right, 0), g.getOrDefault(root.right, 0)));

    }
}
posted @ 2020-10-31 15:48  lippon  阅读(243)  评论(0编辑  收藏  举报