DP(7) | 打家劫舍① | Java | LeetCode 198, 213, 337 做题总结

打家劫舍问题

来源于代码随想录:https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html#%E6%80%9D%E8%B7%AF

① 确定dp数组(dp table)以及下标的含义
dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。

② 确定递推公式
决定dp[i]的因素就是第i房间偷还是不偷。

  • 偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。

  • 不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,(注意这里是考虑,并不是一定要偷i-1房,这是很多同学容易混淆的点)

然后dp[i]取最大值,dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);

③ dp数组初始化
从递推公式dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);可以看出,递推公式的基础就是dp[0] 和 dp[1]

从dp[i]的定义上来讲,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);

④ 确定遍历顺序
dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是从前到后遍历

⑤ 举例推导dp数组(略)

198.打家劫舍

class Solution {public int rob(int[] nums) {if(nums.length == 1) return nums[0];int[] dp = new int[nums.length+1];dp[0] = nums[0];dp[1] = nums[0]>nums[1]?nums[0]:nums[1];for(int i=2; i<nums.length; i++) {dp[i] = Math.max(dp[i-2]+nums[i], dp[i-1]);}return dp[nums.length-1];}
}

213.打家劫舍II

和打家劫舍1区别在,成环-首尾相连
因为首元素和尾元素不能同时存在,所以有三种情况。

三个情况
①不考虑首元素也不考虑尾元素
②考虑首不考虑尾:相当于没有尾元素
③考虑尾不考虑首:
注意情况②③是包含情况①的

class Solution {public int rob(int[] nums) {if(nums.length == 1) return nums[0];if(nums.length == 2) return Math.max(nums[0], nums[1]);return Math.max(robAction(nums,0,nums.length-2), robAction(nums,1,nums.length-1));}public int robAction(int[] nums, int start, int end) {int len = end-start+1;int[]dp = new int[len]; //end-start+1长度dp[0] = nums[start];dp[1] = Math.max(dp[0], nums[start+1]);for(int i=2; i<len; i++) {dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i+start]);}return dp[len-1];}
}

出错点

dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i+start]); dp数组的下标是从0开始,但是nums数组的取值要加上start

337.打家劫舍III

树型DP入门级别题目

每个节点只有两个状态:偷 OR 不偷

dp[0]不偷,dp[1]偷。每一层都有一个长度为2的dp数组

我的出错点:对当前节点不偷的情况,没了解清楚。当前节点不偷 其实总体有四种情况①左孩子偷 右孩子偷 ②左孩子不偷 右孩子不偷 ③左孩子偷右孩子不偷 ④左孩子不偷右孩子偷,这四种方法其实都包含在这一句话中 res[1] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); 。也就是左孩子选最大情况,右孩子选最大情况,本质上是动态规划依赖上一状态的具体体现,

class Solution {public int rob(TreeNode root) {int[] res = robAction1(root);return Math.max(res[0], res[1]);}int[] robAction1(TreeNode root) {int res[] = new int[2];if (root == null)return res;int[] left = robAction1(root.left);int[] right = robAction1(root.right);res[1] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);res[0] = root.val + left[1] + right[1];return res;}
}

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

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

相关文章

pytorch 笔记:torch.optim.Adam

torch.optim.Adam 是一个实现 Adam 优化算法的类。Adam 是一个常用的梯度下降优化方法&#xff0c;特别适合处理大规模数据集和参数的深度学习模型 torch.optim.Adam(params, lr0.001, betas(0.9, 0.999), eps1e-08, weight_decay0, amsgradFalse, *, foreachNone, maximizeFa…

配置阿里云

ubuntu 20.04 设置国内镜像源&#xff08;阿里源、清华源&#xff09;_ubuntu 20.04 镜像源-CSDN博客 参考 sudo cp /etc/apt/sources.list /etc/apt/sources.list.back vim /etc/apt/sources.list sudo apt update sudo apt upgrade阿里云Ubuntu镜像&#xff1a;https://d…

I2C总线二级外设驱动开发(函数和代码详解)

I2C总线二级外设驱动开发是一个涉及多个步骤和函数调用的过程&#xff0c;主要目的是使得挂接在I2C总线上的外设能够正常工作。 一、I2C总线二级外设驱动开发概述 I2C总线是一种广泛使用的串行通信总线&#xff0c;用于连接微控制器及其外围设备。在Linux内核中&#xff0c;I2…

实验四 FPGA 使用Verilog HDL设计电机运动控制程序

实验目的 1.掌握使用GPIO控制直流电机的原理。 2.掌握使用Verilog HDL设计电机运动控制程序的方法。 实验要求 采用Verilog HDL语言设计直流电机运动控制程序&#xff0c;实现直流电机的运动控制&#xff0c;并通过数码管显示当前输出的PWM波的占空比。通过按键或拔位开关可…

ArcGIS Pro不能编辑ArcGIS10.X的注记的解决办法

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 一、问题 我们利用ArcGIS Pro编辑ArcGIS10.X系列软件生成的注记要素类的时候&#xff0c;会提示不…

Apache POI-Excel入门与实战

目录 一、了解Apache POI 1.1 什么是Apache POI 1.2 为什么要使用ApaChe POI 1.3 Apache POI应用场景 1.4 Apache POI 依赖 二、Apache POI-Excel 入门案例 2.1 写入Excel文件 2.2 读取文件 四、Apache POI实战 4.1 创建一个获取天气的API 4.2高德天气请求API与响应…

iphone11 如何打开开发者模式?

嗨&#xff0c;大家好&#xff0c;我是兰若姐姐。 今天有小伙伴在问&#xff0c;怎么打开ios手机的开发者模式&#xff0c;他需要做app自动化测试&#xff0c;他的手机是是iphone11&#xff0c;今天就把iphone11开发者打开的步骤给记录分享下 在电脑上安装 Xcode&#xff1a;开…

Sqlmap中文使用手册 - Techniques模块参数使用

目录 1. Techniques模块的帮助文档2. 各个参数的介绍2.1 --techniqueTECH2.2 --time-secTIMESEC2.3 --union-colsUCOLS2.4 --union-charUCHAR2.5 --union-fromUFROM2.6 --dns-domainDNS2.7 --second-urlSEC2.8 --second-reqSEC 1. Techniques模块的帮助文档 Techniques:These o…

怎样使用 Juicer tools 的 dump 命令将.hic文件转换为交互矩阵matrix计数文件 (Windows)

创作日志&#xff1a; 万恶的生信…一个scHiC数据集没有提供处理好的计数文件&#xff0c;需要从.hic转换。Github一个个好长的文档看了好久才定位到 juicer tools 的dump命令&#xff0c;使用起来比想象中简单。 一、下载Juicer tools 注意&#xff1a;使用Juicer tools的前提…

邮件安全篇:邮件反垃圾系统运作机制简介

1. 什么是邮件反垃圾系统&#xff1f; 邮件反垃圾系统是一种专门设计用于检测、过滤和阻止垃圾邮件的技术解决方案。用于保护用户的邮箱免受未经请求的商业广告、诈骗信息、恶意软件、钓鱼攻击和其他非用户意愿接收的电子邮件的侵扰。 反垃圾系统的常见部署形式 2. 邮件反垃圾…

Dubbo SPI 之路由器

1. 背景介绍 Dubbo 是一个高性能的 Java RPC 框架&#xff0c;由阿里巴巴开源并广泛应用于分布式系统中。在 Dubbo 的架构中&#xff0c;SPI&#xff08;Service Provider Interface&#xff09;是一个关键组件&#xff0c;允许在运行时动态加载不同的服务实现。SPI 机制提供了…

day6 io线程

获取终端输入的字符

深入探究 Golang 反射:功能与原理及应用

Go 出于通用性的考量&#xff0c;提供了反射这一功能。借助反射功能&#xff0c;我们可以实现通用性更强的函数&#xff0c;传入任意的参数&#xff0c;在函数内通过反射动态调用参数对象的方法并访问它的属性。举例来说&#xff0c;下面的bridge接口为了支持灵活调用任意函数&…

构建自动化的魔法:Gradle Build Init的深度解析

构建自动化的魔法&#xff1a;Gradle Build Init的深度解析 在软件开发过程中&#xff0c;自动化构建是提高效率和保证质量的关键。Gradle&#xff0c;作为一个强大的构建工具&#xff0c;提供了丰富的功能来帮助开发者自动化构建过程。其中&#xff0c;Gradle的构建配置包&am…

python一维表转二维表

一维表转二维表 import pandas as pd # 读取数据 product_df pd.read_csv(rD:\excelFile\practice\物品属性值一维表.csv,encodingutf-8) # print(product_df)# 将一维表转变二维 s pd.Series(list(product_df[属性值]),index[product_df[物品编号],product_df[属性名]]) …

【git】github中的Pull Request是什么

在 Git 中&#xff0c;"pull request"&#xff08;简称 PR&#xff09;是一种在分布式版本控制系统中使用的功能&#xff0c;特别是在使用 GitHub、GitLab、Bitbucket 等基于 Git 的代码托管平台时。Pull Request 允许开发者请求将他们的代码更改合并到另一个分支&am…

GMSSL2.x编译鸿蒙静态库和动态库及使用

一、编译环境准备 1.1 开发工具 DevEco-Studio下载。 1.2 SDK下载 ​ 下载编译第三方库的SDK有两种方式&#xff0c;第一种方式从官方渠道根据电脑系统选择对应的SDK版本&#xff0c;第二种方式通过DevEco-Studio下载SDK。本文只介绍通过DevEco-Studio下载SDK的方式。 安装…

C语言 指针方法 将n个数按输入时顺序的逆序排列

将n个数按输入时顺序的逆序排列,用函数实现。 #include <stdio.h>void reverseArray(int *arr, int n) {int temp;for (int i 0; i < n / 2; i) {temp arr[i];arr[i] arr[n - 1 - i];arr[n - 1 - i] temp;} }int main() {int n;printf("Enter the number of…

centos中zabbix安装、卸载及遇到的问题

目录 Zabbix简介Zabbix5.0和Zabbix7.0的区别监控能力方面模板和 API 方面性能、速度方面 centos7安装Zabbix(5.0)安装zabbix遇到的问题卸载Zabbix Zabbix简介 Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参…

给Docker配置网络代理

代理信息 假设我的代理服务器地址为&#xff1a;192.168.3.3:7890 # Dockerd 代理 # 配置 在执行 docker pull 时&#xff0c;是由守护进程 dockerd 来执行。因此&#xff0c;代理需要配在 dockerd 的环境中。而这个环境&#xff0c;则是受 systemd 所管控&#xff0c;因此…