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

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)

相关文章:

  • 信创国产化
  • vue3实现鼠标悬浮div动画效果
  • espefuse.py烧录MAC地址
  • 若依项目天气模块
  • PHP中文网文章内容提取免费API接口教程
  • Cypress API 中文详解
  • Python基于Django的校园打印预约系统(附源码,文档说明)
  • LangChain实战:MMR和相似性搜索技术应用
  • 01 redis 的环境搭建
  • 第六章 进阶14 项目周报的妙用
  • 湖北理元理律师事务所:债务优化服务的流程透明度建设
  • 基于Matlab实现卫星轨道模拟仿真
  • 抗辐照加固CANFD芯片:以车规级设计提升商业航天系统可靠性
  • MySQL高可用集群
  • 小黑大语言模型应用探索:langchain智能体构造源码demo搭建1(初步流程)
  • QEMU/KVM课程大纲暨学习路线(1)
  • 通义灵码2.5——基于编程智能体开发Wiki多功能搜索引擎
  • 多卡训练核心技术详解
  • 【Go语言】Fyne GUI 库使用指南 (面向有经验开发者)
  • 1,QT的编译教程
  • 网站优化排名的方法/推广软件赚钱
  • 建网站素材/商品关键词怎么优化
  • 香港空间的网站会关吗/百度快照怎么打开
  • 专业定制网站建设哪里有/游戏推广员好做吗
  • 襄阳购物网站开发设计/百度应用市场下载安装
  • 小企业网站建设多少钱/青岛网站制作