算法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博客

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日五道java面试题之mysql数据库篇(五)

目录&#xff1a; 第一题. 联合索引是什么&#xff1f;为什么需要注意联合索引中的顺序&#xff1f;第二题. 什么是数据库事务&#xff1f;第三题. 事物的四大特性(ACID)介绍一下?第四题. 按照锁的粒度分数据库锁有哪些&#xff1f;锁机制与InnoDB锁算法?第五题. 从锁的类别上…

Linux 防火墙 操作命令【实用】

防火墙操作&#xff1a; 描述命令查看防火墙状态systemctl status firewalld、firewall-cmd --state暂时关闭防火墙systemctl stop firewalld永久关闭防火墙systemctl disable firewalld开启防火墙systemctl start firewalld开放指定端口firewall-cmd --zonepublic --add-port…

Docker常见命令使用

Docker命令是使用Docker的基础。这里记录下Docker日常运维过程中经常使用到的一些命令&#xff0c;更全面的命令还请参考Docker官网。 docker用法概述 Docker命令可以通过CLI工具实现与服务器的交互。Docker命令的语法如下&#xff1a; docker [DOCKER-COMMAND] [OPTIONS] […

基于openKylin与RISC-V的MindSpore AI项目实践

项目目标&#xff1a; 在openKylin系统上安装和配置MindSpore框架。开发一个简单的图像分类模型&#xff0c;并在RISC-V平台上进行训练和推理。根据RISC-V的特性&#xff0c;对MindSpore框架进行必要的优化。 目录 项目目标&#xff1a; 训练模型 编写训练代码&#xff0c;设…

Mysql之存储过程与函数

Mysql之存储过程与函数 存储过程概述分类创建存储过程一般的语法格式完整的语法格式案例一案例二 调用存储过程调用语法格式 创建存储函数存储过程与函数的查看&#xff0c;修改和删除 存储过程概述 官网解释是&#xff1a;存储过程的英文是 Stored Procedure 。它的思想很简单…

微信小程序开发:循环定时删除阿里云oss上传的文件

上文有说到我们开发了定时删除阿里云oss的功能&#xff0c;但是一次只能删除10条。 本文我们做到一次删除全部过期的文件。 实现&#xff1a;使用while循环&#xff0c;在循环里获取是否还有已过期的&#xff0c;没有就break掉&#xff0c;有就走删除逻辑。 开始代码部分&am…

鸿蒙系统适配的流程

鸿蒙系统适配的流程通常涉及以下关键步骤&#xff0c;以下是鸿蒙系统适配的一般流程&#xff0c;具体流程可能会根据项目的具体需求和开发团队的情况进行调整和优化。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 准备工作&#…

常见限流算法及其实现

一、背景 在分布式系统中&#xff0c;随着业务量的增长&#xff0c;如何保护核心资源、防止系统过载、保证系统的稳定性成为了一个重要的问题。限流算法作为一种有效的流量控制手段&#xff0c;被广泛应用于各类系统中。本文将详细介绍四种常见的限流算法、两种常用的限流器工…

贝叶斯优化双向门控循环单元BO-BIGRU时序预测的matlab实现【源代码】

贝叶斯优化双向门控循环单元简介&#xff1a; 贝叶斯优化双向门控循环单元&#xff08;BO-BIGRU&#xff09;是一种结合了贝叶斯优化和双向门控循环单元&#xff08;BIGRU&#xff09;的神经网络模型。BIGRU是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;它…

ArcGIS学习(十三)多源数据下的城市街道功能评估

ArcGIS学习(十三)多源数据下的城市街道功能评估 本任务带来的内容是多元数据下的城市街道功能评估。本任务包括两个关卡: 城市街道空间中观解读 城市街道功能详细评价 首先,我们来看看本任务的分析思路。 1.城市街道空间中观解读 下面我们正式进入第一关的内容一- 城市…

学习Python类型和对象,看这篇文章足矣!

类型与对象 一点基础理论: 对象代表现实世界中像轿车、狗、自行车这些事物。对象具有数据和行为两个主要特征。 在面向对象编程中&#xff0c;我们把数据当作属性&#xff0c;把行为当作方法。即&#xff1a; 数据 → 属性 和 行为 → 方法 类型是创造单个对象实例的蓝本。…

Vue基础入门(2)- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程

Vue基础入门&#xff08;2&#xff09;- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程 文章目录 Vue基础入门&#xff08;2&#xff09;- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程5 生命周期5.1 Vue生命周期钩子5.2 在creat…

面向对象高级编程上

面向对象高级编程 一、面向对象高级编程上&#xff08;1&#xff09;C代码基本形式&#xff08;2&#xff09;Header中的防卫式声明&#xff08;3&#xff09;不带指针类的实现过程1. 防卫式声明2. 访问级别3.构造函数4.重载4.1 成员函数&#xff08;有this&#xff09;4.2 非成…

Igraph入门指南 1

Igraph入门指南 一、图的结构 图是顶点和边的集合&#xff0c;而边是通过顶点来描述。顶点和边&#xff0c;要用集合的理念去操作。 1、igraph中与图结构相关的函数 .igraph(), add_edges(), add_vertices(), complementer(),compose(), connect(), contract(), delete_ed…

自我对比: 通过不一致的解决视角更好地进行反思

一、写作动机&#xff1a; LLM 在自我评价时往往过于自信或随意性较大&#xff0c;提供的反馈固执或不一致&#xff0c;从而导致反思效果不佳。为了解决这个问题&#xff0c;作者提倡 "自我对比"&#xff1a; 它可以根据要求探索不同的解决角度&#xff0c;对比差异…

并发编程并发安全性之Lock锁及原理分析

ReentrantLock 用途:锁是用来解决线程安全问题的 重入锁-> 互斥锁 满足线程的互斥性意味着同一个时刻&#xff0c;只允许一个线程进入到加锁的代码中。多线程环境下&#xff0c;满足线程的顺序访问 锁的设计猜想 一定会涉及到锁的抢占&#xff0c;需要有一个标记来实现互…

论文学习—Model-based Adversarial Meta-Reinforcement Learning

Model-based Adversarial Meta-Reinforcement Learning Abstract1. Introduction2. Related work3 Preliminaries基于模型的强化学习&#xff08;MBRL&#xff09;:区别和联系&#xff1a; 4 Model-based Adversarial Meta-Reinforcement Learning4.1 Formulation 4.2 Computin…

java实现文件上传到本地

很多时候我们都需要进行文件上传和下载的操作&#xff0c;具体怎么实现网上的代码其实也是挺多的&#xff0c;刚好我的项目中也遇到了文件上传和下载的需求&#xff0c;本篇博文具体讲解上传操作&#xff0c;下篇博文讲解下载操作。 我们具体来想一想要将一个从前端传来的文件…

【原理图PCB专题】Allegro模块化移动器件报...has the LOCKED property怎么解锁?

在模块化原理图时,PCB也需要做一个模块.mdd文件。这时需要先画好图纸然后再制作模块化文件。 修改文件时会发现模块化器件报错,无法编辑模块内部器件和走线,器件和走线都被LOCKED,如下所示报错内容: Symbol "U1" Selected Cannot edit Symbol "U1". M…

磁性机器人在医学领域取得进展

磁性医疗机器人利用磁场梯度来控制设备的运动&#xff0c;并最终以高精度进入体内的目标组织。这些磁性机器人可以采用导管和微型或纳米机器人的形式&#xff0c;并由磁导航系统操纵。磁性机器人最近取得了一些进展&#xff0c;为临床诊断和治疗用途开辟了新的可能性。在本期的…