当前位置: 首页 > 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)

http://www.dtcms.com/a/222991.html

相关文章:

  • 信创国产化
  • 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的编译教程
  • Go语言结构体:数据组织的艺术
  • STL_stack和queue(deque priority_queue)
  • HTML网页-练习float
  • Java 注解式限流教程(使用 Redis + AOP)
  • 【C++】C++面向对象设计的核心思想之一: 接口抽象、解耦和可扩展性
  • 【仿生机器人软件架构】通过整合认知系统实现自主精神性——认知系统非常具有可执行性
  • 深入解析 Redis Cluster 架构与实现(二)
  • python打卡day40@浙大疏锦行
  • AWS云创建安全审计用户组
  • 扫地机器人苦寻新引擎,大疆们却已攻入腹地