【动态规划专栏】专题三:简单多状态dp--------1.按摩师

简介: 【动态规划专栏】专题三:简单多状态dp--------1.按摩师


题目来源

本题来源为:

Leetcode 17.16按摩师

题目描述

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

注意:本题相对原题稍作改动

算法原理

1.状态表示

经验+题目要求

但是还要在细化一下:(在i位置时会有两种情况,选还是不选)

对于本题而言就是:

f[i]表示:选择到i位置时,nums[i]必选,此时的最长预约时长

g[i]表示:选择到i位置时,nums[i]不选,此时的最长预约时长

2.状态转移方程

在分析状态转移方程之前,首先要分两种情况:

第一种情况,到i位置时选择预约,那么i-1位置就不能预约;i-1位置不能预约,看状态表示,就是g[i-1]

因此:

第一种情况,到i位置时不预约,那么i-1位置就有两种情况,预约或者不预约;i-1位置不能预约,看状态表示,就是g[i-1],预约就是f[i-1],最后要取两者的最大值,因为走到i位置的时候,说明i-1位置是已经拿到最长时间过来的。

因此:

所以我们的状态转移方程为:

因此状态方程为:

f[i]=g[i-1]+nums[i];
 g[i]=max(f[i-1],g[i-1]);

3.初始化

只有在0位置会发生越界,因此初始化0位置即可。

4.填表顺序

从左往右,两个表同时填

5.返回值

返回:

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

时间复杂度:O(N)

空间复杂度:O(N)

相关文章
|
API
最新!中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法
最新!中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法
6967 1
最新!中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法
|
存储 关系型数据库 MySQL
MySQL删除索引的方法与注意事项
MySQL删除索引的方法与注意事项
1870 0
|
监控 网络协议 Java
IO 多路复用? 什么是 IO 多路复用? 简单示例(日常生活)来解释 IO 多路复用 一看就懂! 大白话,可爱式(傻瓜式)教学! 保你懂!
本文通过日常生活中的简单示例解释了IO多路复用的概念,即一个线程通过监控多个socket来处理多个客户端请求,提高了效率,同时介绍了Linux系统中的select、poll和epoll三种IO多路复用的API。
836 2
|
Java 索引 安全
[Mvel]Mvel2.0使用指南一 基础
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/75244442 MVEL在很大程度上受到Java语法的启发,作为一个表达式语言,也有一些根本的区别,旨在更高的效率,例如:直接支持集合、数组和字符串匹配等操作以及正则表达式。
16341 0
|
数据挖掘 OLAP OLTP
深入解析:OLTP与OLAP的区别与联系
【8月更文挑战第31天】
3100 0
|
Java Spring 容器
Java获取接口的所有实现类方法
这篇文章介绍了在Java中获取接口所有实现类的方法,包括使用JDK的ServiceLoader(SPI机制)和Spring Boot中的@Autowired自动注入及ApplicationContextAware接口两种方式。
1379 1
|
Prometheus 监控 安全
Java一分钟之-Spring Boot Actuator:健康检查与监控
【6月更文挑战第7天】Spring Boot Actuator 提供了丰富的监控和管理端点,如健康检查、性能监控。要启用Actuator,需添加依赖并配置暴露端点。健康检查可自定义,性能监控可通过Metrics结合Micrometer集成外部系统。安全配置很重要,可以使用Spring Security保护端点。日志和环境信息管理则可通过`/loggers`和`/env`端点。正确使用Actuator能提升应用的可观察性和维护性。
1133 1
|
分布式计算 并行计算 算法
【高并发】什么是ForkJoin?看这一篇就够了!
在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据。有点像Hadoop中的MapReduce。 ForkJoin是由JDK1.7之后提供的多线程并发处理框架。ForkJoin框架的基本思想是分而治之。什么是分而治之?分而治之就是将一个复杂的计算,按照设定的阈值分解成多个计算,然后将各个计算结果进行汇总。相应的,ForkJoin将复杂的计算当做一个任务,而分解的多个计算则是当做一个个子任务来并行执行。
7018 0
【高并发】什么是ForkJoin?看这一篇就够了!
|
存储 算法 Java
深入解析Java中的ForkJoinPool:分而治之,并行处理的利器
深入解析Java中的ForkJoinPool:分而治之,并行处理的利器
|
前端开发 网络协议 Java
Netty | 工作流程图分析 & 核心组件说明 & 代码案例实践
Netty | 工作流程图分析 & 核心组件说明 & 代码案例实践
1098 1