动态规划-简单多状态dp问题1

文章目录

  • 1. 按摩师(面试题 17.16)
  • 2. 打家劫舍 II(213)
  • 3. 删除并获得点数(740)
  • 4. 粉刷房子(LCR 091)


1. 按摩师(面试题 17.16)

题目描述:
在这里插入图片描述
状态表示:
设定两个数组,一个数组f[i]代表在i位置接受预约的时长,另一个数组g[i]代表在i位置不接受预约的时长。
状态转移方程:
更新f[i]的值,因为不能连续接收预约,所以f[i]=g[i-1]+nums[i]。更新g[i]=max(f[i-1],g[i-1]),因为如果在i位置不接受预约,i-1位置有接受预约和不接受预约两种情况。
初始化:
避免越界,f数组初始化f[0]=nums[0],g[0]=0。
填表顺序:
从左至右。
返回值:
max(f[n-1],g[n-1])。
代码如下:

class Solution {
    public int massage(int[] nums) {
        int n = nums.length;

        if (n == 0) {
            return 0;
        }
        int[] f = new int[n];
        int[] g = new int[n];

        f[0] = nums[0];

        for (int i = 1; i < n; i++) {
            f[i] = g[i - 1] + nums[i];
            g[i] = Math.max(g[i - 1], f[i - 1]);

        }

        return Math.max(g[n - 1], f[n - 1]);
    }
}

题目链接
时间复杂度:O(n)
空间复杂度:O(n)

2. 打家劫舍 II(213)

题目描述:
在这里插入图片描述
状态表示:
这一题思想和上一题按摩师思想是类似的,因此设定两个数组,一个数组f[i]代表在i位置偷窃达到的最高偷窃价值,另一个数组g[i]代表在i位置不偷窃达到的最高偷窃价值。
状态转移方程:
这里的状态转移方程和上题也是类似的,f[i]=g[i-1]+nums[i],g[i]=max(f[i-1],g[i-1]),只不过要注意处理首尾连接的情况,大概可以分为两种情况,第一种情况就是在0位置偷窃,那么n-1位置就不能偷窃,第二种情况是在0位置不偷窃。然后分别计算这两种情况搜刮的价值返回最大的即可。
初始化:
这题的初始化和上题一致,根据具体情况避免越界即可。
填表顺序:
都是从左至右。
返回值:
两种情况的最大值,具体可以看代码。

class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        return Math.max(robChild(nums, 2, n - 2) + nums[0], robChild(nums, 1, n - 1));
    }

    public int robChild(int[] nums, int start, int end) {
        if (start > end) {
            return 0;
        }

        int[] f = new int[end - start + 1];
        int[] g = new int[end - start + 1];

        f[0] = nums[start];
        for (int i = 1; i <= end - start; i++) {
            f[i] = g[i - 1] + nums[i + start];
            g[i] = Math.max(g[i - 1], f[i - 1]);
        }

        return Math.max(f[end - start], g[end - start]);
    }

}

题目链接
时间复杂度:O(n)
空间复杂度:O(n)

3. 删除并获得点数(740)

题目描述:
在这里插入图片描述
状态表示:
这题比较特殊,首先要进行数据预处理,将nums数字的数字存到计数数组count中,如下图。
在这里插入图片描述
然后根据count计数数组定义f[i]为删除i位置对应的数字之后能够得到的最大点数,g[i]为不删除i位置对应的数字之后能够得到的最大点数。
状态转移方程:
因为删除数字并且获得点数之后就要删除所有数字±1的相邻的数字,所以f[i]=g[i-1]+count[i]*(i+nums[0]),另外g[i]=max(f[i-1],g[i-1])。
初始化:
为了避免越界要初始化f[0]以及g[0]。
填表顺序:
从左至右。
返回值:
max(f[n-1],g[n-1])。
代码如下:

class Solution {
    public int deleteAndEarn(int[] nums) {
        Arrays.sort(nums);
        int[] count = new int[nums[nums.length - 1] - nums[0] + 1];

        for (int i = 0; i < nums.length; i++) {
            count[nums[i] - nums[0]] += nums[i];
        }

        int n = count.length;

        int[] f = new int[n];
        int[] g = new int[n];
        f[0] = count[0];

        for (int i = 1; i < n; i++) {
            f[i] = g[i - 1] + count[i];
            g[i] = Math.max(f[i - 1], g[i - 1]);
        }

        return Math.max(g[n - 1], f[n - 1]);
    }
}

题目链接
时间复杂度:O(n)
空间复杂度:O(n)

4. 粉刷房子(LCR 091)

题目描述:
在这里插入图片描述
状态表示:
分别定义三个数组f[i],g[i],h[i]分别代表将i位置的房子粉刷成红色、蓝色或者绿色。
状态转移方程:
因为相邻的房子不能是相同的颜色,并且不同颜色有不同的花费。所以f[i]=min(g[i-1]+cost,h[i-1]+cost),g[i]=min(f[i-1]+cost,h[i-1]+cost),h[i]=min(f[i-1]+cost,g[i-1]+cost)。
初始化:
为了避免越界要先初始化f[0]、g[0]、h[0]。
填表顺序:
从左至右。
返回值:
min(f[n-1],g[n-1],h[n-1])。
代码如下:

class Solution {
    public int minCost(int[][] costs) {
        int n = costs.length;

        int[] f = new int[n];
        int[] g = new int[n];
        int[] h = new int[n];

        f[0] = costs[0][0];
        g[0] = costs[0][1];
        h[0] = costs[0][2];

        for (int i = 1; i < n; i++) {
            f[i] = Math.min(g[i - 1], h[i - 1]) + costs[i][0];
            g[i] = Math.min(f[i - 1], h[i - 1]) + costs[i][1];
            h[i] = Math.min(g[i - 1], f[i - 1]) + costs[i][2];

        }
        return Math.min(f[n - 1], Math.min(g[n - 1], h[n - 1]));
    }
}

题目链接
时间复杂度:O(n)
空间复杂度:O(n)

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

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

相关文章

字节码文件的组成

字节码文件的组成 字节码文件的组成1 以正确的姿势打开文件2 字节码文件的组成2.1 基本信息2.2 常量池2.3 字段2.4 方法2.5 属性 3 字节码常用工具3.1 javap3.2 jclasslib插件3.3 Arthas 4 字节码常见指令 字节码文件的组成 1 以正确的姿势打开文件 字节码文件中保存了源代码…

【数据结构】习题之链表的回文结构和相交链表

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;前路漫漫亦灿灿 前言 今日的习题是关于链表的&#xff0c;分别是链表的回文结构和相交链表的判断。 链表的回文结构 题目为&#xff1a;链表的回文结…

校园通用型发生网络安全事件解决方案

已知校园多教学楼、多教学机房、非标网络机房缺乏防护设备、检测设备、安全保护软件(杀软) 切断所有外网&#xff0c;断网处理!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 部署路由系统可选择爱快、routeros、openwrt。等。可将日志上传到日志分析系统。《这项非必要的》 部署开源防火…

JVM—对象的创建流程与内存分配

JVM—对象的创建流程与内存分配 创建流程 对象创建的流程图如下&#xff1a; 对象的内存分配方式 内存分配的方式有两种&#xff1a; 指针碰撞&#xff08;Bump the Pointer&#xff09;空闲列表&#xff08;Free List&#xff09; 分配方式说明收集器指针碰撞&#xff08…

Aritest+python+Jenkins解放双手iOS/Android自动化

ARITest、Python 和 Jenkins 可以结合在一起创建一个自动化测试解决方案&#xff0c;实现持续集成和持续测试的目标。以下是三者如何协同工作的基本概念&#xff1a; 1. **ARITest**&#xff1a; ARITest 是一款功能全面的自动化测试工具&#xff0c;提供 UI 自动化、接口自…

加强金融行业关键信息基础设施安全保护,有效防范网络安全风险

当前&#xff0c;随着数字化发展的不断深入&#xff0c;关键信息基础设施作为国家的重要战略资源&#xff0c;面临着国内外严峻的网络安全风险。为了确保国家安全&#xff0c;在国家发展各领域和全过程中&#xff0c;需要将安全发展贯穿始终&#xff0c;筑牢国家安全屏障。金融…

C++从入门到精通——类和对象(下篇)

1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _mont…

【CSS疑难点汇总】1.bor-box失效情况总结以及高宽设置为auto的情况

1. box-sizing box-sizing是改变盒子宽高的计算方式&#xff0c;一般使用bor-box&#xff0c;消除padding和border对整个盒子的影响&#xff0c;但在没有明确给出宽高的情况下&#xff0c;box-sizing是没有效果的 1.1 box-sizing不生效的情况 1.1.1块级盒子嵌套 ​ 宽度继承…

使用快捷回复软件的好处

在现代的客服工作中&#xff0c;尤其是店铺大促期间&#xff0c;咨询量的激增往往让客服人员应接不暇。即使打字速度再快&#xff0c;也难以跟上源源不断的客流。想应对这样的情况&#xff0c;快捷回复软件就非常适合客服人员了。 以我个人正在使用的客服宝为例&#xff0c;我想…

2024年阿里云优惠合集:2核2G3M云服务器61元/年起

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

Unity中图片和Base64字符串之间的转换

大家好&#xff0c;我是阿赵。   这次来讲一下在unity引擎里面&#xff0c;图片和base64字符串的互相转换问题。 一、图片传输的多种方式 有时候我们需要把图片通过网络传输发送。   在Unity里面&#xff0c;有不止一种方式可以实现&#xff0c;比如说&#xff0c;把图片的…

Python+Requests模拟发送GET请求

模拟发送GET请求 前置条件&#xff1a;导入requests库 一、发送不带参数的get请求 代码如下&#xff1a; 以百度首页为例 import requests# 发送get请求 response requests.get(url"http://www.baidu.com") print(response.content.decode("utf-8"))…

数据结构之单链表的相关知识点及应用

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构 目录 链表的概念及结构 链表与顺序表的区别与优劣势 链表的分类 单链表的实现 单链表中增加节点 单链表中尾插数据 打印单链…

研发岗-面临统信UOS系统配置总结

第一步 获取root权限 配置环境等都需要用到root权限&#xff0c;所以我们先获取到root权限&#xff0c;方便下面的操作 下载软件 在UOS应用商店下载的所需应用 版本都比较低 安装node 官网下载了【arm64】的包&#xff0c;解压到指定文件夹&#xff0c;设置链接&#xff0…

jmeter监听器大家都会用,但我这个妙招能让你提早一小时下班!

使用过 jmeter 的同学&#xff0c;应该都会使用监听器&#xff0c;在每个监听器中&#xff0c;都会有一个“所有数据写入一个文件”的功能&#xff0c;那这个功能应该怎么用呢&#xff1f;今天&#xff0c;我们就来讲讲这个功能的使用。 几乎所有的监听器都有这样一个功能。 那…

spring boot admin搭建,监控springboot程序运行状况

新建一个spring boot web项目&#xff0c;添加以下依赖 <dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.3.0</version></dependency> <dependency&…

动态内存;

目录 1.malloc; 简要介绍&#xff1a; 如何使用&#xff1a; free函数&#xff1a; 2.calloc; 简要介绍&#xff1a; 与malloc的区别&#xff1a; 3.realloc; 简要介绍&#xff1a; 如何使用&#xff1a; 4.动态内存常见错误&#xff1b; 1.malloc; 简要介绍&#x…

M12设备端面板安装连接器板后安装(前锁)L扣

M12设备端面板安装连接器板后安装(前锁)L扣 优势 -100% 电气测试及插拔测试-对于紧凑型设备&#xff1a;可在有限空间内传输很高的功率-密封圈受过度拧紧保护&#xff0c;实现长期可靠的密封 标准 IEC61076-2-111 锁紧方式 螺纹锁紧 订单料号 P/N: L-KYF12K4Z-PG9-M-L0.…

【SERVERLESS】AWS Lambda上实操

通过Serverless的发展历程及带给我们的挑战&#xff0c;引出我们改如何改变思路&#xff0c;化繁为简&#xff0c;趋利避害&#xff0c;更好的利用其优势&#xff0c;来释放企业效能&#xff0c;为创造带来无限可能。 一 Serverless概述 无服务器计算近年来与云原生计算都是在…

「2024」React 状态管理入门

概念 简单来说&#xff0c;状态指的是某一时刻应用中的数据或界面的呈现。这些数据可能包括用户填写表单的信息、应用内的用户偏好设置、应用的页面/路由状态、或者任何其他可能改变UI的信息。 状态管理是前端开发中处理用户界面(UI)状态的过程&#xff0c;在复杂应用中尤其重…