当前位置: 首页 > ai >正文

leetcode动态规划—打家劫舍系列

lc198 打家劫舍

对于房屋i,考虑偷与不偷

偷i:dp[i-2] + nums[i]

不偷i :dp[i-1]

class Solution:def rob(self, nums: List[int]) -> int:#dp[i]: 考虑编号【0-i】房间,偷取的最大金额为dp[i]#dp[i] = max(dp[i-1], dp[i-2]+nums[i])#求解dp[n-1]n = len(nums)if n < 2:return nums[0]dp = [0] * ndp[0] = nums[0]dp[1] = max(nums[0], nums[1])for i in range(2, n):dp[i] = max(dp[i-1], dp[i-2]+nums[i])return dp[n-1]

lc213 打家劫舍II

拆分为两种情况

考虑头,不考虑尾

考虑尾,不考虑头

class Solution:def rob(self, nums: List[int]) -> int:def rob1(nums):n = len(nums)if n < 2:return nums[0]dp = [0] * ndp[0] = nums[0]dp[1] = max(nums[0], nums[1])for i in range(2, n):dp[i] = max(dp[i-1], dp[i-2]+nums[i])return dp[n-1]n = len(nums)if n < 2:return nums[0]return max(rob1(nums[0:n-1]), rob1(nums[1:n]))

lc337 打家劫舍III

动态规划法

每层用一个dp数组来存储状态

层与层的状态转移依赖返回值决定,因此是后序遍历

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def rob(self, root: Optional[TreeNode]) -> int:#dp[0] 不偷父节点得到的最大金额#dp[1] 偷父节点得到的最大金额def post_traversal(node):if not node:return (0, 0)dp_left = post_traversal(node.left)dp_right = post_traversal(node.right)#偷父节点, 不偷左右孩子val1 = node.val + dp_left[0] + dp_right[0]#不偷父节点,可考虑左右孩子val0 = max(dp_left[0], dp_left[1]) + max(dp_right[0], dp_right[1])return (val0, val1)return max(post_traversal(root)[0], post_traversal(root)[1])

记忆递归法

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def rob(self, root: Optional[TreeNode]) -> int:used_map = {}def post_traversal(node):if not node:return 0if used_map.get(node) is not None:return used_map[node]#偷父节点 不考虑左右孩子val1 = node.valif node.left:val1 += post_traversal(node.left.left) + post_traversal(node.left.right)if node.right:val1 += post_traversal(node.right.left) + post_traversal(node.right.right)#不偷父节点, 考虑左右孩子val2 = post_traversal(node.left) + post_traversal(node.right)res = max(val1, val2)used_map[node] = resreturn resreturn post_traversal(root)

http://www.xdnf.cn/news/9928.html

相关文章:

  • iOS 使用CocoaPods 添加Alamofire 提示错误的问题
  • 改写自己的浏览器插件工具 myChromeTools
  • RSTP介绍加实操
  • 2025年05月30日Github流行趋势
  • MyBatisPlus--快速入门
  • 【计算机网络】传输层TCP协议——协议段格式、三次握手四次挥手、超时重传、滑动窗口、流量控制、
  • 得物前端面试题及参考答案(精选50道题)
  • CppCon 2014 学习:Making C++ Code Beautiful
  • 测试分类详解
  • 【C++】22. 红黑树封装实现Mymap和Myset
  • 【Python】第一弹:对 Python 的认知
  • 计算机网络 HTTP篇常见面试题总结
  • 【前端】macOS 的 Gatekeeper 安全机制阻止你加载 bcrypt_lib.node 文件 如何解决
  • 图解深度学习 - 基于梯度的优化(梯度下降)
  • MySQL之约束和表的增删查改
  • 清华大学发Nature!光学工程+神经网络创新结合
  • 代码随想录算法训练营 Day61 图论ⅩⅠ Floyd A※ 最短路径算法
  • 从认识AI开始-----解密门控循环单元(GRU):对LSTM的再优化
  • Rust 编程实现猜数字游戏
  • 2025年通用 Linux 服务器操作系统该如何选择?
  • 移动端图片浏览插件
  • MicroPython+L298N+ESP32控制电机转速
  • CPU中断频繁导致红外信号失真:问题分析与解决方案
  • Mac系统下,利用wget批量下载ICESat-2测高内陆水位高数据ALT13
  • 如何应对客户对项目进度的过度干预
  • 数据库读写分离解决方案
  • Python学习(4) ----- Python的CSV文件处理
  • REALTECK瑞昱推出RTS5411T USB3.2 Gen1x1 超高速 USB 集线器控制器原厂代理分销经销一级代理分销经销
  • 上传图片转成3D VR效果 / VR效果在项目中落地实践 / 应用到了用photo-sphere-viewer + A-Frame +Threejs 通过不同的技术分别实现了3D VR效果
  • 一种冷库低成本节能方案:不改动原有装备,实现年省电≥20%