题目

https://leetcode.com/problems/house-robber-iii/


思考:什么情况下 dp 需要强制包含当前元素?

dp 过程中,需要包含当前元素 的例子:

  • leetcode 322. Coin Change | 322. 零钱兑换(动态规划)
  • leetcode 300. Longest Increasing Subsequence | 300. 最长递增子序列(动态规划)
  • 算法设计与分析:0-1背包问题(动态规划)

dp 过程中,不需要包含当前元素 的例子:

  • leetcode 198. 打家劫舍(动态规划)
  • leetcode 213. House Robber II | 213. 打家劫舍 II(动态规划)

当问题类似于 前缀和问题、背包问题 的时候,也就是 对 dp 数组的访问是按照索引进行随机访问 的情况下,需要在每一个状态上包含元素本身信息,所以这种情况下 通常强制包含当前元素

而当问题类似于 打家劫舍 问题的时候,结果与被遍历序列的前后顺序有关,对 dp 数组的访问只涉及到 i-1, i-2 等这些有限个数的相邻下标(假设当前元素下标为 i),不需要对前面的 dp 数组进行随机访问,这时不需要存储每一个状态下的元素本身信息,通常不用强制包含当前元素


题解

参考了:https://leetcode.com/problems/house-robber-iii/discuss/79330/Step-by-step-tackling-of-the-problem 的开头,有了点思路,后面自己写的。

可以看作是一个树形 dp 问题,也可以参考:左神算法:找到二叉树中的最大搜索二叉子树(树形dp套路,Java版)

class Solution {public int rob(TreeNode root) {if (root == null) return 0;rob(root.left);rob(root.right);int l, r, ll, lr, rl, rr;l = r = ll = lr = rl = rr = 0;if (root.left != null) {l = root.left.val;if (root.left.left != null) {ll = root.left.left.val;}if (root.left.right != null) {lr = root.left.right.val;}}if (root.right != null) {r = root.right.val;if (root.right.left != null) {rl = root.right.left.val;}if (root.right.right != null) {rr = root.right.right.val;}}// root.val 存储【偷或不偷】当前元素时的最大值root.val = Math.max(root.val + ll + lr + rl + rr, l + r);return root.val;}
}

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

  1. leetcode 213. House Robber II | 213. 打家劫舍 II(Java)

    题目 https://leetcode.com/problems/house-robber-ii/ 题解 这道题是「198. 打家劫舍」的进阶,和第 198 题的不同之处是,这道题中的房屋是首尾相连的 ...

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

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

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

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

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

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

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

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

  6. 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 ...

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

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

  8. C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...

  9. LeetCode 807. 保持城市天际线 / 630. 课程表 III(贪心+优先队列)/ 851. 喧闹和富有(拓扑排序)

    807. 保持城市天际线 2021.12.13 每日一题 题目描述 给你一座由 n x n 个街区组成的城市,每个街区都包含一座立方体建筑.给你一个下标从 0 开始的 n x n 整数矩阵 grid ...

最新文章

  1. 面试 | 22道机器学习常见面试题目
  2. HIVE时间戳错误unix_timestamp时间不同环境相差8小时
  3. 各大公司广泛使用的在线学习算法FTRL详解
  4. access对比数据_数据仓库系列之数据质量管理
  5. LeetCode 1038. 从二叉搜索树到更大和树(逆中序-右根左-降序)
  6. java同步list_Java集合--ArrayList出现同步问题的原因
  7. 008 查看套接字选项是否受支持(获取当前环境下套接字选项默认值)
  8. Sublime Text3 Emmet用法
  9. Struts,Spring,Hibernate三大框架的面试
  10. 学习笔记(前端跨域 Storage封装)
  11. 使用PyCharm官方中文语言包汉化PyCharm
  12. 每个大主播都是满屏弹幕,怎么做到的?Python实战无限刷弹幕!
  13. 使用xpath批量爬取堆糖图片
  14. POJ1759Garland题解
  15. emacs常用配置-Hippie-expand自动补全
  16. 美元对全球汇率 免费 api
  17. python数字推盘游戏怎么显示步数_Python游戏开发:《最强大脑》同款游戏【数字华容道】...
  18. 网页Unity3d游戏全离线玩的高招!
  19. 多相机拍照系统3D拍照建模,3D真人手办,博物馆模型制作
  20. 项目开发计划书_100个知识点—商业计划书

热门文章

  1. ZOJ - 3593 One Person Game(扩展欧几里得)
  2. VIM-多文件-多窗口
  3. 漫游kafka实战篇之搭建Kafka开发环境
  4. cocos2d-x游戏实例(9)-A星算法(5)
  5. frida hook java层常用模板
  6. Python获取.wav音频的时长
  7. Windows中非常实用的命令
  8. 最精美详尽的 HTTPS 原理图
  9. 设计模式:状态模式(State)
  10. 使用 litmus 验证内存重排