zoukankan      html  css  js  c++  java
  • LeetCode337. 打家劫舍 III

    ☆☆☆☆思路:树形DP问题。

    class Solution {
        /**
         *  1.状态的定义:dp[node][j] 表示 node是否偷取所能获得的最大价值。
         *      j = 0, 表示node节点不偷 ; j = 1, 表示node结点偷取
         *  2.状态转移方程:
         *      如果当前节点偷,那么左右子节点均不能偷。
         *      如果当前节点不偷,那么左右子节点偷不偷都可,选最大值。
         *
         *  遍历方式选择 <后序遍历>
         *       因为,子结点陆续汇报信息给父结点,一层一层向上汇报,最后在根结点汇总值。
         */
        public int rob(TreeNode root) {
            int[] res = dfs(root);
            return Math.max(res[0], res[1]);
        }
        private int[] dfs(TreeNode node) {
            if (node == null) {
                return new int[]{0,0};
            }
            int[] left = dfs(node.left);
            int[] right = dfs(node.right);
            // dp[0]:以当前 node 为根结点的子树能够偷取的最大价值,规定 node 结点不偷
            // dp[1]:以当前 node 为根结点的子树能够偷取的最大价值,规定 node 结点偷
            int[] dp = new int[2];
            dp[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); // 当前节点不偷,下家可偷可不偷
            dp[1] = node.val + left[0] + right[0]; // 当前节点偷,那么下家就不能偷了
            return dp;
        }
    }
  • 相关阅读:
    字符串题表
    插头dp题表
    点分治题表
    Kd-tree题表
    【BZOJ 4605】崂山白花蛇草水 替罪羊树套线段树
    假的kd-tree小结
    【BZOJ 1492】 [NOI2007]货币兑换Cash 斜率优化DP
    CDQZ 2017 游记
    【BZOJ 1146】[CTSC2008]网络管理Network
    联赛之前的题表(已完成)汇总(可能有遗漏)
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/14217113.html
Copyright © 2011-2022 走看看