算法46:动态规划专练(力扣198: 打家劫舍 力扣740:删除并获取点数)

打家劫舍问题

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。

分析:

这一题看起来是隔一家偷一家的问题。其实不是那么回事。它和爬楼梯花费最小代价是一个性质的题目.

a.  只有1户人家,没到选; 2户人家偷钱多的。

b. 如果是 3户人家,那就要看偷的钱数的累加和了。假设数组为: [2,3,4]. 偷的最大金额就是 2+4 =6;中间隔一家

c. 假设是4户人家 : [3,2,4,10]. 

数值32410
下标0123
偷窃最大金额33713

     偷窃的最大金额是13.

package code04.动态规划专项训练01;/*** 力扣198题 : 打家劫舍问题* https://leetcode.cn/problems/house-robber/?envType=study-plan-v2&envId=dynamic-programming*/
public class Rob_05 {public int rob(int[] nums){if (nums == null || nums.length == 0) {return 0;}//只有1间房if (nums.length == 1) {return nums[0];}//2间房,偷金额大的if (nums.length == 2) {return Math.max(nums[0], nums[1]);}int n = nums.length;//动态规划,普遍现象就是dp表长度要多1个。int[] dp = new int[n];dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < nums.length; i++) {dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i]);}return dp[n-1];}public static void main(String[] args) {// int[] arr ={2,1,1,2};//  int[] arr ={1,7,9,4};int[] arr ={1,2,3,1};Rob_05 ss = new Rob_05();System.out.println(ss.rob(arr));}
}

   

力扣740:删除并获取点数

给你一个整数数组 nums ,你可以对它进行一些操作。

每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。

示例 1:

输入:nums = [3,4,2]
输出:6
解释:
删除 4 获得 4 个点数,因此 3 也被删除。
之后,删除 2 获得 2 个点数。总共获得 6 个点数。

示例 2:

输入:nums = [2,2,3,3,3,4]
输出:9
解释:
删除 3 获得 3 个点数,接着要删除两个 2 和 4 。
之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。
总共获得 9 个点数。

这一题很好玩,可以借鉴词频统计的思想。之前我写过关于词频统计的博客,有兴趣的可以翻一翻。

a. 这一题可能会出现重复值的问题。而且如果我们选取了值为3的元素,那就得把2和4的值都给删除掉了。

b. 词频统计的思想,一旦字母固定,那么在数组中的位置也就固定了。同样的道理,一旦值固定,我们创新新的数组,用这个值对应新数组的下标,那么这个值对应的下标也就固定了。

以[2,2,3,3,3,4] 举例子

转变后数组变成了

无重复数组:                          [0, 1, 2, 3, 4] 

根据无重复数组,算的累加和 [0, 0, 4, 9, 4]

 为什么数组长度为4 ?

根据元素数组的最大值确定数组长度。

package code04.动态规划专项训练01;/*** 力扣 740 : 删除并获取点数*  https://leetcode.cn/problems/delete-and-earn/description/?envType=study-plan-v2&envId=dynamic-programming*/
public class DeleteAndEarn_06
{public int deleteAndEarn(int[] nums) {//边界值if (nums == null || nums.length == 0) {return 0;}//只有1个数if (nums.length == 1) {return nums[0];}//找出最大值int max = 0;for(int i = 0; i < nums.length; i++) {max = Math.max(max, nums[i]);}//这一点不好,根据数组的最大值,确定辅助数组的长度int size = max + 1;//统计出每个值出现的点数int[] ss = new int[size];for (int i = 0; i < nums.length; i++) {//词频统计的思路,每个字母出现对应的ASSC码不变//本题中,重复值出现的话,ss数组的下标志值也不会改变,但是点数会累加ss[nums[i]] += nums[i];}//dp表放置的是逐个数出现的最大值。它是随着数组个数的变化而逐渐变化的// 数组为1,那最大值就为1.//数组为 {1,2}, 那最大值就为2//数组为{1,2,4}. 那最大值就是 2+ 4 = 6.int[] dp = new int[ss.length];dp[0] = ss[0];dp[1] = ss[0] >= ss[1] ? ss[0] : ss[1];for (int index = 2; index < ss.length; index++) {//ss[i]就是有序的,它的排序是按照原始数组的值进行排序的。//原始数组一旦选定num[i], 还得考虑num[i]-1 和 num[i]+1 的问题// 经过转换:// num[i]-1 就变成了 index -1;//当前只遍历到 index,不存在 num[i]+1 即 index + 1的情况dp[index] = Math.max(dp[index-1], dp[index-2] + ss[index]);}return dp[max];}public static void main(String[] args) {//int[] arr = {3,4,2};//int[] arr = {3,1};int[] arr = {1,1,1,2,4,5,5,5,6};DeleteAndEarn_06 ss = new DeleteAndEarn_06();System.out.println(ss.deleteAndEarn(arr));}
}

本道题是数据量可能有限,我看测试是通过了,并设 85%的胜率也还算不错了。

但是,这一题确定新数组长度的思想是按照数组最大值确定的。假设数组为 [2,2,3,3,100万], 难到你的新数组长度要定义成100万?

离散化技巧 : 在说线段树的时候,我多次使用过离散化的技巧。并且专门分析过:算法41:掉落的方块(力扣699题)----线段树-CSDN博客

这一题,我觉得使用离散化技巧去确定新数组的长度更合适,具体我就不去尝试了,感谢的可以尝试一下

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

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

相关文章

Windows Server 2003 搭建邮件服务器实现自建邮箱域名及账户并连接外网

前言 2008 之后的版本微软删除了 POP 服务导致只能安装 SMTP 服务&#xff0c;所以这里只写了关于 2003 版本的教程 点击左下角开始➡管理工具➡管理您的服务器&#xff0c;点击添加或删除角色 点击下一步 选择自定义配置&#xff0c;点击下一步 选择邮件服务器&#xff0c…

vue3中压缩图片的大小

效果 上传一张图片&#xff0c;看看文件的大小。我们会发现小了很多 思路 图片太大也是因为宽高太大&#xff0c;进行宽高的缩放就可以了 实现过程 const onUpload async ({ file }) > {console.log(file);if (file.size / 1024 / 1024 > 100) {message.error(大小不…

uniapp模仿下拉框实现文字联想功能 - uniapp输入联想(官方样式-附源码)

一、效果 废话不多说&#xff0c;上效果图&#xff1a; 在下方的&#xff1a; 在上方的&#xff1a; 二、源码 一般是个输入框&#xff0c;输入关键词&#xff0c;下拉一个搜索列表。 ElementUI有提供<el-autocomplete>&#xff0c;但uniapp官网没提供这么细&#x…

备考2024年北京高考数学:20114~2023十年选择题练习和解析

距离2024年高考还有三个月的时间&#xff0c;如何用三个月的时间再提高北京数学高考的成绩&#xff1f;吃透历年真题以及背后的知识点是行之有效的方法 之一。 今天我们来看一下2014-2023年的北京市高考数学的选择题&#xff0c;从过去十年&#xff08;2014-2023&#xff09;的…

深入浅出解析SSL:保障网络安全的加密技术

在数字信息时代&#xff0c;网络安全已成为人们关注的重点。为了在网络传输过程中保护数据的完整性和机密性&#xff0c;我们需要一种强大的安全协议——SSL&#xff08;安全套接层&#xff09;。今天德迅云安全就带大家来简单了解下SSL是什么&#xff0c;它的工作原理以及为何…

SpringCloudGateway理论与实践

文章目录 网关介绍为什么需要网关Gateway 使用gateway pom依赖yml 配置重启测试总结 断言过滤器工厂路由过滤器的种类请求头过滤器默认过滤器总结 网关介绍 Spring Cloud Gateway 是一个基于Spring Framework 5&#xff0c;由Spring Cloud团队开发的全新的API网关服务。它旨在…

qtvs2022工程cmakelist.txt添加QCharts模块

find_package(QT NAMES Qt5 COMPONENTS Core Gui Widgets OpenGL Concurrent Charts Sql Network REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Widgets OpenGL Charts Concurrent Sql Network REQUIRED)这里find_package只是设置搜索路径&#xff0c;为…

ES入门十:关系模型的实现:嵌套类型和父子文档

现实中&#xff0c;关系模型是到处存在的&#xff0c;例如书本与作者的关系。但是在ES中想要处理这个事情并不简单 在ES中保存关系型模型数据的方式主要有以下几种&#xff1a; nested&#xff1a;在这种方式中&#xff0c;会通过一对多的放系保存在同一个文档中join&#xf…

Centos 9 安装 k8s

为了尽可能契合生产环境的部署情况&#xff0c;这里用kubeadm安装集群&#xff0c;同时方便跟随笔记一步步实践的过程&#xff0c;也更加了解k8s的一些特性和基础知识。 先决条件 这里将通过虚拟机安装3台centos stream 9服务器&#xff0c;并组成kubeneters集群&#xff08;…

Vue基础篇

Vue Vue是一套用于构建用户界面的渐进式JavaScript框架 什么是渐进式? Vue可以自底向上逐层地应用; 当构建简单应用时, 只需一个轻量小巧的核心库; 当构建复杂应用时, 可以引入各式各样的Vue插件 Vue具有以下特点: 采用组件化模式, 提高代码复用率且让代码更好维护 声明式编…

Vue+SpringBoot打造考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

10 个 Java Stream 顶级技巧,大量简化代码

Java Stream API对于 Java 开发人员来说就像一把瑞士军刀 — 它用途广泛、结构紧凑,并且可以轻松处理各种任务。 它为开发人员提供了一种函数式和声明式的方式来表达复杂的数据转换和操作,使代码更加简洁和富有表现力。 但能力越大,责任越大,有效地使用Stream API需要对最…

MySQL学习笔记(一)数据库事务隔离级别与多版本并发控制(MVCC)

一、数据库事务隔离级别 数据库事务的隔离级别有4种&#xff0c;由低到高分别为Read uncommitted &#xff08;读未提交&#xff09;、Read committed&#xff08;读提交&#xff09; 、Repeatable read&#xff08;可重复读&#xff09; 、Serializable &#xff08;串行化&a…

如何在异步结果返回时进行跟踪

当我在使用多进程池时&#xff0c;可以通过apply_async()方法提交任务&#xff0c;并使用get()方法获取异步任务的结果。但是&#xff0c;在等待结果返回时&#xff0c;我们最希望能够跟踪任务的进度&#xff0c;以及处理已完成任务的结果。 然后针对这种问题我们最常见的方法…

国际数字影像产业园会议中心助力打造舒适高端的会议目的地

国际数字影像产业园会议中心&#xff0c;作为集先进技术与卓越设计于一体的现代化会议场所&#xff0c;正日益成为国内外高端会议活动的首选之地。其独特的建筑风格和内部设施&#xff0c;为与会者提供了舒适而高效的环境&#xff0c;让每一次大中小型会议都能达到预期的效果。…

如何关闭远程桌面连接

远程桌面连接是一种方便的技术&#xff0c;可以让用户通过网络远程访问其他计算机的桌面界面。有时候我们可能需要关闭这个连接。本文将向你介绍如何关闭远程桌面连接。 关闭远程桌面连接的步骤 要关闭远程桌面连接&#xff0c;按照以下步骤操作&#xff1a; 打开远程桌面连接…

最简单 导航栏 html css

dhl.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>导航栏</title><link type"text/css" rel"stylesheet" href"css/dhl.css"></head><div class"dhl&quo…

数据分析案例-二手车用户数据可视化分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【深度学习笔记】计算机视觉——风格迁移

风格迁移 摄影爱好者也许接触过滤波器。它能改变照片的颜色风格&#xff0c;从而使风景照更加锐利或者令人像更加美白。但一个滤波器通常只能改变照片的某个方面。如果要照片达到理想中的风格&#xff0c;可能需要尝试大量不同的组合。这个过程的复杂程度不亚于模型调参。 本…

leetcode 11.盛最多水的容器

题目链接&#xff1a;https://leetcode.cn/problems/container-with-most-water/ 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以…