首页 > 其他分享 >【树形DP入门题】NO337 打家劫舍III

【树形DP入门题】NO337 打家劫舍III

时间:2023-04-29 10:34:33浏览次数:51  
标签:right NO337 III rob null root 节点 DP left

【树形DP入门题】337. 打家劫舍 III

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

示例 1:

image-20230429093225676
输入: root = [3,2,3,null,3,null,1]
输出: 7 
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

image-20230429093240942
输入: root = [3,4,5,1,3,null,1]
输出: 9
解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9

提示:

  • 树的节点数在 [1, 104] 范围内
  • 0 <= Node.val <= 104
暴力解法
    public int rob(TreeNode root) {
        if(root == null) {
            return 0;
        }

        // 偷父节点
        var result1 = root.val;
        if(root.left != null) {
            result1 += rob(root.left.left) + rob(root.left.right);
        }

        if(root.right != null) {
            result1 += rob(root.right.left) + rob(root.right.right);
        }

        // 不偷父节点
        var result2 = 0;
        result2 += rob(root.left);
        result2 += rob(root.right);

        return Math.max(result1, result2);
    }
  • 时间复杂度O(n^2),遍历全部节点以及他们的孙子节点,不是太准确,因为涉及到孙子节点的重复计算(计算了root节点的孙子节点之后,又计算root子节点的左右孩子节点的时候,又把孙子节点计算了一次)
  • 空间复杂度O(logn)
记忆化递推
HashMap<TreeNode, Integer> f = new HashMap<>();

    public int rob(TreeNode root) {
        if(root == null) {
            return 0;
        }
        if(f.get(root) != null) {
            return f.get(root);
        }

        // 偷父节点
        var result1 = root.val;
        if(root.left != null) {
            result1 += rob(root.left.left) + rob(root.left.right);
        }

        if(root.right != null) {
            result1 += rob(root.right.left) + rob(root.right.right);
        }

        // 不偷父节点
        var result2 = 0;
        result2 += rob(root.left);
        result2 += rob(root.right);

        var result = Math.max(result1, result2);
        f.put(root, result);

        return result;
    }
  • 记忆化递推避免重复计算子孙节点
动态规划:状态标记的递归

​ 在上面两种方法中没有对节点 偷与不偷得到的最大金钱数 进行记录,因此每次都需要进行实时计算:每次root计算都要举例一遍子节点偷与不偷的情况,子节点再往下递归然后回溯(尽管hash避免了重复计算),而如果能够记录,则直接能够根据子节点偷与不偷的的最大值判断当前节点偷还是不偷,就免去了子节点往下的递归然后回溯的过程

    public int rob(TreeNode root) {
        var res = robAction1(root);
        return Math.max(res[0], res[1]);
    }


    public int[] robAction1(TreeNode root) {
        var res = new int[2];
        if(root == null) {
            return res;
        }
        var left = robAction1(root.left);
        var right = robAction1(root.right);
        // 不选当前节点
        res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        // 选择当前节点
        res[1] = root.val + left[0] + right[0];

        return res;
    }

标签:right,NO337,III,rob,null,root,节点,DP,left
From: https://www.cnblogs.com/tod4/p/17363666.html

相关文章

  • 设置wordpress:设置标题字号大小(wordpress 6.2)
    一,未设置之前字号过大,如图:说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源码可以访问这里获取: https://github.com/liuhongdi/     或: https://gitee.com/liuhongdi说明:作者:刘宏缔邮箱:3711253......
  • 设置wordpress:隐藏 自豪地采用WordPress 链接(wordpress 6.2)
    一,未隐藏前的效果说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源码可以访问这里获取: https://github.com/liuhongdi/     或: https://gitee.com/liuhongdi说明:作者:刘宏缔邮箱:[email protected]......
  • 安装wordpress 6.2(php 7.4.2)
    一,得到安装包的下载地址:1,官网地址:https://cn.wordpress.org/ 如图:点击获取WordPress按钮2,在下载WordPress6.2按钮上右键,选择: 复制链接地址,复制的链接如下:https://cn.wordpress.org/latest-zh_CN.zip说明:刘宏缔的架构森林是一个专注架构的博客,地址......
  • C#使用委托在Socket Udp端口侦听线程内更新主窗口控件显示
    c#开启线程侦听SocketUDP端口,端口接收到网络读卡器的读卡数据后刷新UI界面显示接收数据,解析数据包信息并向读卡器发送显示文字、驱动读卡器播报语音、蜂鸣响声提示、开启继电器开关等操作。  .net提示通过设置:CheckForIllegalCrossThreadCalls=false,可以在子线程内强制更新......
  • CDN加速WordPress触发CORS导致跨域加载失败
    这两天折腾CDN加速来提升自己博客的访问速度,用的阿里云CDN加速方案;使用的时候发现一个问题,部分资源CDN加速失败,原因是触发了CORS,因为CDN加速网址与博客网址不一致引发的跨域请求不成功;从报错中发现Off与Tff字体加载报错:(index):1AccesstoFontat'http://cdn.5yun.org/wp-conte......
  • 第六届河南省赛 zzulioj 1484: 探 寻 宝 藏 (二维双线DP)nyoj 712
    1484:探寻宝藏TimeLimit: 1Sec  MemoryLimit: 128MBSubmit: 76  Solved: 37SubmitStatusWebBoardDescription传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物。某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷......
  • LAoj 3695 - Distant Galaxy (DP&几何)好题高效
    YouareobservingadistantgalaxyusingatelescopeabovetheAstronomyTower,andyouthinkthatarectangledrawninthatgalaxywhoseedgesareparalleltocoordinateaxesandcontainmaximumstarsystemsonitsedgeshasagreatdealtodowiththemys......
  • wordpress产品排序
    updatewp_postssetmenu_order=100wherepost_type='product';updatewp_postssetmenu_order=5wherepost_name='r-m-williams-craftsman-boot_792c678e';updatewp_postssetmenu_order=10wherepost_name='r-m-williams-rod-polo_ee292998......
  • 彻底明白Zigbee术语——群集(Cluster)、端点(EndPoint)等
      在学习zigbee协议栈的时候经常看到应用程序、zigbee设备对象(ZDO)、节点、设备、端点、群集、属性、绑定、寻址等一下zigbee术语,不知道这些zigbee术语是表示什么,是如何定义的,是如何区分的,是如何划分的以及他们之间有什么联系,一切的一切全不知道。网上也有很多zigbee术......
  • CF1814E Chain Chips & CF750E New Year and Old Subsequence - 动态 dp -
    一句话概括动态dp:用来解决带修改/多次区间询问的dp问题。将转移写成矩阵的形式,然后利用线段树求解区间问题/单点修改1814E注意一条边要么选2要么选0次,而且第一条边一定是选了2次。如果有一条边没选,那么这条边两侧的边一定都选了。设\(f_i\)代表考虑到第\(i\)条边,......