欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法——打家劫舍问题

程序员文章站 2022-07-12 09:08:27
...

树状排列问题
链接: 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)));

    }
}