代码随想录算法训练营第45天(py)| 动态规划 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍

力扣链接
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金。
如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组nums,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

思路

当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。
当前状态和前面状态会有一种依赖关系,那么这种依赖关系都是动规的递推公式。

  1. 确定dp含义
    在[0:i]的房屋内,能窃取的最高金额为dp[i]
  2. 确定递推公式
如果当前房间要偷,dp[i] = dp[i-2] + num[i] #注意是i-2,否则就报警了
如果当前房间不偷,dp[i] = dp[i-1]
综上,dp[i] = max( dp[i-2] + nums[i] , dp[i-1] )
  1. 初始化
    显然dp[0]=nums[0],dp[1]=max(nums[0],nums[1])
    由于递推公式用到了max,那么剩下全部都全部都为0
  2. 确定遍历顺序
    从前向后
class Solution:def rob(self, nums: List[int]) -> int:if len(nums)==1:return nums[0]dp = [0]*len(nums)dp[0] = nums[0]dp[1] = max(nums[0], nums[1])for i in range(2, len(nums)):dp[i] = max( dp[i-2] + nums[i] , dp[i-1] )return dp[-1]

213.打家劫舍II

力扣链接
题目和上一题一样,不过这个地方所有的房屋都 围成一圈

思路

这题唯一的改动就是数组成环形了。可以分成两种情况考虑:

  1. 完全不考虑nums[0],只对后面的元素进行打家劫舍
  2. 完全不考虑nums[-1],只对前面的元素进行打家劫舍
class Solution:def rob(self, nums: List[int]) -> int:if len(nums)==1:return nums[0]list1 = nums[1:]# 不考虑第一个元素list2 = nums[:-1]# 不考虑最后一个元素res1 = self.single_rob(list1)res2 = self.single_rob(list2)return max(res1, res2)def single_rob(self, nums: List[int]) -> int: ##非环形打家劫舍的函数if len(nums)==1:return nums[0]dp = [0]*len(nums)dp[0] = nums[0]dp[1] = max(nums[0], nums[1])for i in range(2, len(nums)):dp[i] = max( dp[i-2] + nums[i] , dp[i-1] )return dp[-1]

337.打家劫舍III

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

思路

如果抢了当前节点,两个孩子就不能动。
并且,遍历二叉树需要后序遍历(左右中),因为需要返回值来进行下一步计算。

使用一个长度为2的数组,记录当前节点偷与不偷所得到的的最大金钱。
递归三部曲+动规五部曲:

  1. 确定递归函数参数和返回值
    返回值:表示i节点偷与不偷两个状态所得到的金钱,返回一个长度为2的数组dp,参数为当前节点
  2. 确定终止条件
    碰到空节点就返回
  3. 确定遍历顺序
    后序遍历:
    递归左节点,得到左节点偷与不偷的钱。
    递归右节点,得到右节点偷与不偷的钱。
  4. 确定单层递归逻辑
如果偷当前节点,那其孩子节点不能偷
val1 = cur.val + left[0] + right[0]
如果不偷当前节点,那其孩子节点可以偷
val2 = max(left[0], left[1]) + max(right[0], right[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:# dp数组(dp table)以及下标的含义:# 1. 下标为 0 记录 **不偷该节点** 所得到的的最大金钱# 2. 下标为 1 记录 **偷该节点** 所得到的的最大金钱dp = self.traversal(root)return max(dp)def traversal(self,node): #后序遍历if not node:return (0,0)left = self.traversal(node.left)right = self.traversal(node.right)# 不偷当前节点, 偷子节点val_0 = max(left[0], left[1]) + max(right[0], right[1])# 偷当前节点, 不偷子节点val_1 = node.val + left[0] + right[0]return (val_0, val_1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短剧片源授权,类目丰富优惠多,抢先一步更新你的短剧系统片库!

前言 如今的短剧作为一种新兴的视听艺术形式,正以其独特的魅力迅速占领市场高地。为了满足广大短剧爱好者和从业者的需求,我们提供短剧片源授权服务,凭借剧场独家提供的丰富片源,助力您轻松更新短剧系统片库,抢占市场…

MySQL小版本升级(8.0.36->8.0.37)

关于MySQL升级的话MySQL官方文档上面介绍了2个方法,’就地升级’和‘逻辑升级’。’就地升级‘就是升级底层的RPM包而‘逻辑升级’就是将旧MySQL数据库上的信息迁移到新MySQL数据库上。 本篇文章介绍到的是RPM包升级 升级MySQL版本的典型步骤包括: 备份&…

算法篇-排序

快排 算法思想:每次找一个基数,然后对数组左右遍历,将小于基数的数据放到左边,大于基数的数放到右边,然后将基数左边,右边进行迭代再排序。 public static void quickSort(int[] nums, int left, int ri…

shell的函数

1、定义 将命令序列按照格式写在一起。 格式指的是函数的固定格式,有两种格式 2、作用 (1)方便重复使用 形成一个函数库,集中在一起,随时可以传参调用。 (2)大的工程分割成若干个小的功能…

SCIE与SCI期刊的区别

在学术出版领域,SCI(Science Citation Index)和SCIE(Science Citation Index Expanded)是两个关键的索引数据库,它们对科研人员在选择发表论文的期刊时起着至关重要的作用。虽然这两个术语经常被交替使用&a…

linux创建账号

在Linux中创建用户账号通常使用useradd命令。以下是一个基本的示例: sudo useradd -m 用户名这里-m选项意味着创建用户主目录,如果不存在的话。 如果你还想设置用户密码,可以使用passwd命令: sudo passwd 用户名这将提示你输入…

Python100题(含答案)

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末 温馨提示:篇幅有限,已打包文件夹,获取方式在:文末 篇幅有限,这份完整版的Python100题已经上传,朋友们如果…

from import *

项目结构 假设我们的项目结构如下: my_project/ |-- dataset/ | |-- __init__.py | |-- imbalance_cifar.py | |-- balance_cifar.py |-- main.py代码示例 1. dataset/imbalance_cifar.py # dataset/imbalance_cifar.pyclass IMBALANCECIFAR10:def __init…

easyx之图形库复习--自制写轮眼的图形绘制

引子效果图如下: 什么是easyx? EasyX 是针对 C/C 的图形库,可以帮助使用C/C语言的程序员快速上手图形和游戏编程。比如,可以用 VC EasyX 很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方…

软考 系统架构设计师系列知识点之杂项集萃(42)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(41) 第67题 Windows操作系统在图形界面处理方面采用的核心架构风格是( )风格。Java语言宣传的“一次编写,到处运行”的特性,从架构风格…

AI PPT生成器,一键在线智能生成PPT工具

PPT作为商业沟通和教育培训中的重要工具,PPT制作对于我们来说并不陌生。但是传统的PPT制作不仅耗时,而且想要做出精美的PPT,需要具备一定的设计技能。下面小编就来和大家分享几款AI PPT工具,只要输入主题,内容就可以在…

学生分组

题目描述 有 n 组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界 R 和下界 L (L≤R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 N 组学生的人数都在 [L,R] 中。 输入格式 第一行…

1台SW工作站5人同时使用能实现吗

在当今的数字化时代,高效的工作方式和技术创新是企业竞争力的重要组成部分。SolidWorks作为一款功能强大的三维设计软件,广泛应用于机械、电子、建筑等多个领域。然而,随着企业规模的扩大和团队人数的增加,如何充分利用有限的资源…

关于undo的问题

以下都查看下 undo保留时间: show parameter undo; 查UNDO段状态及自动调整的保留时间命令: select BEGIN_TIME,END_TIME,MAXQUERYLEN,MAXQUERYSQLID,TUNED_UNDORETENTIONfrom V$UNDOSTAT Order By begin_time Desc; 查UNDO段EXPIRED等使用情况&#…

大模型网信办备案全网最详细流程【附附件】

本文要点:大模型备案最详细说明,大模型备案条件有哪些,《算法安全自评估报告》模板,大模型算法备案,大模型上线备案,生成式人工智能(大语言模型)安全评估要点,网信办大模型备案。 大模型备案安…

Linux企业 集群批量管理-秘钥认证

集群批量管理-秘钥认证 概述 管理更加轻松:两个节点,通过秘钥认证形成进行访问,不需要输入密码,单向服务要求(应用场景): 一些服务在使用前要求我们做秘钥认证 手动写批量管理脚本名字&#x…

【Python入门与进阶】Python 中的正则表达式

Python 中的正则表达式是通过内置模块 re 来实现的。正则表达式是一种用于模式匹配和文本处理的强大工具,可以用于查找、替换、分割字符串等操作。 基本用法 以下是 re 模块中一些常用的函数和方法: re.compile(pattern, flags0):编译正则…

来自 Kubecon Paris 的快讯

一年一度的 KubeconEU 审查时间到了——它未经过滤,偶尔不受 CNCF 的欢迎——但剧透警告,巴黎取得了巨大的成功。我们总是爱这里的人,我们并不总是爱场地或演出管理,但巴黎是一场胜利,更重要的是,Kubernete…

德国慕尼黑智慧能源展去了多少家国内充电企业?

无论是为了突破本土市场的局限,出海开拓更广阔的国际市场需求,增加销售额,分散市场风险,还是为了通过出海获得国际经验后以反哺国内市场。 各大行业都出现了“要么出海,要么出局”的声音。扬帆出海,参与全球…

C语言 | Leetcode C语言题解之第155题最小栈

题目: 题解: //单调栈 单调递减 typedef struct {//正常 stackint stack[10000];int stackTop;//辅助 stackint minStack[10000];int minStackTop; } MinStack;MinStack* minStackCreate() {MinStack* newStack (MinStack *) malloc(sizeof(MinS…