在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。

计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。

示例 1:

输入: [3,2,3,null,3,null,1]

     3/ \2   3\   \ 3   1

输出: 7
解释: 小偷一晚能够盗取的最高金额 = 3 + 3 + 1 = 7.

示例 2:

输入: [3,4,5,1,3,null,1]

     3/ \4   5/ \   \ 1   3   1

输出: 9
解释: 小偷一晚能够盗取的最高金额 = 4 + 5 = 9.

动态规划

简化一下这个问题:一棵二叉树,树上的每个点都有对应的权值,每个点有两种状态(选中和不选中),问在不能同时选中有父子关系的点的情况下,能选中的点的最大权值和是多少。

我们可以用 f(o) 表示选择 o 节点的情况下,o 节点的子树上被选择的节点的最大权值和;g(o) 表示不选择 o 节点的情况下,o 节点的子树上被选择的节点的最大权值和;l 和 r 代表 o 的左右孩子。

  • 当 o 被选中时,o 的左右孩子都不能被选中,故 o 被选中情况下子树上被选中点的最大权值和为 l 和 r 不被选中的最大权值和相加,即 f(o)=g(l)+g®。
  • 当 o 不被选中时,o 的左右孩子可以被选中,也可以不被选中。对于 o 的某个具体的孩子 x,它对 o 的贡献是 x 被选中和不被选中情况下权值和的较大值。故 g(o)=max{f(l),g(l)}+max{f®,g®}。

Code

 def rob(self, root: TreeNode) -> int:def _rob(r):if not r:return 0, 0ls, ln = _rob(r.left)rs, rn = _rob(r.right)return r.val + ln + rn, max(ls, ln) + max(rs, rn)return max(_rob(root))

337. House Robber III 打家劫舍 III相关推荐

  1. 代码随想录Day48|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

    文章目录 198.打0家劫舍 213.打家劫舍II 337.打家劫舍III 198.打0家劫舍 文章讲解:代码随想录 (programmercarl.com) 题目链接:198. 打家劫舍 - 力扣( ...

  2. day40|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

    198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 ...

  3. Day48 | 198. 打家劫舍 | 213.打家劫舍Il |337. 打家劫舍 III

    198. 打家劫舍 注意点: 1. 递推公式,dp[j-2]+nums[j]表示的是加上nums[j]后dp[j]的值, dp[j-1]表示的是不加nums[j]后dp[j-1]的最大值 class ...

  4. 337.打家劫舍 III 121. 买卖股票的最佳时机

    337.打家劫舍 III 树形dp,采用后序遍历,用dp[0],dp[1] 分别表示不取当前物品,和取当前物品的所获最大利润 /*** Definition for a binary tree nod ...

  5. leetcode 337. House Robber III | 337. 打家劫舍 III(树形dp;什么情况下dp需要强制包含当前元素?)

    题目 https://leetcode.com/problems/house-robber-iii/ 思考:什么情况下 dp 需要强制包含当前元素? dp 过程中,需要包含当前元素 的例子: leet ...

  6. LeetCode 337. 打家劫舍 III(记忆化+递归)

    文章目录 1. 题目 1.1 相关题目: 2. 解题 2.1 递归 2.2 记忆化递归 1. 题目 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称 ...

  7. 104. Leetcode 337. 打家劫舍 III (动态规划-打家劫舍)

    步骤一.确定递归函数的参数和返回值: dp数组及下标的含义 dp数组的长度为2, 下标为0记录不偷该节点所得到的的最大金钱,下标为1记 录偷该节点所得到的的最大金钱. 步骤二.确定终止条件: 在遍历的 ...

  8. 【LeetCode笔记】337. 打家劫舍III(Java、树型动态规划)

    文章目录 题目描述 思路 & 代码 更新版 题目描述 这年头当个小偷,都得会 dp 和二叉树了 和前面的 I & II 有点不同,这次直接换了数据结构,写树来了.(之后不会是图吧) 很 ...

  9. leetcode —— 337. 打家劫舍 III

    在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根". 除了"根"之外,每栋房子有且只有一个" ...

最新文章

  1. linux LVM 系统盘扩容
  2. linux中cd命令及范例,15个Linux中的“cd”命令的实际示例
  3. 记一次批量处理数据库中的敏感信息
  4. 终于有人把Knative讲明白了
  5. Mac下的浏览器速度比较,Chrome 得分最高
  6. Java中int和Integer的区别
  7. 简易php access文章管理系统,PHP+ACCESS 文章管理程序代码
  8. 数据挖掘决策树python_机器学习之决策树ID3(python实现)
  9. php漫画连载系统,小涴熊漫画连载系统带采集API开源
  10. 程序员学习必备书单汇总,超全!
  11. 关于Stream流的使用
  12. 沉病孩子留遗嘱 父疏申请接济劫持红十字员农
  13. check 和nocheck
  14. 「CTS2019」氪金手游
  15. 问题-某个程序改了ICO图标后编译后还是显示老图标?
  16. 读书笔记 -- 算法入门
  17. 黑苹果NVIDIA显卡驱动程序【WebDriver-378.05.05.25f16 +支持 macOS 10.12.6 Sierra (16G2016)版本】
  18. 人一般长到几岁才会停止长高?
  19. The MegaFace Benchmark-1 Million Faces for Recognition at Scale
  20. 金山文档手机app服务器异常,手机为什么打不开金山文档 打不开金山文档怎么办...

热门文章

  1. TCP/IP协议(二)tcp/ip基础知识
  2. springmvc过滤器简单实例
  3. Go丨语言学习笔记--func
  4. 能够提高开发效率的Eclipse实用操作
  5. JAVA中int、String的类型转换
  6. struts2配置文件中action的name属性
  7. Spartan-II 应用指南 转载
  8. 【Vegas原创】终端服务器超出了最大允许连接数 解决方法
  9. 多线程编程之四——线程的同步
  10. python中转义字符怎么用_python中的转义字符i