动态规划-简单多状态dp问题 -- 按摩师

news2025/2/28 17:40:51

动态规划-简单多状态dp问题 – 按摩师

文章目录

  • 动态规划-简单多状态dp问题 -- 按摩师
    • 题目重现
    • 算法流程
    • 示例代码

题目重现

题目链接:按摩师 - 力扣

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

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。

示例 2:

输入: [2,7,9,3,1]
输出: 12
解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。

示例 3:

输入: [2,1,4,5,3,1,1,3]
输出: 12
解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。

算法流程

1.状态表示

这里我们选用较为常用的方式:以某个位置为结尾,定义一个状态表示:

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

但是该题中我们对于每个 i 位置都有 “选择” 和 “不选择” 两种方案,所以对 dp[i] 进行细分为 f[i] 和 g[i] :

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

2.状态转移方程

由于往常状态表示只有一个,状态转移方程也只有一个,但是如今有两个状态表示 f 和 g,所以状态转移方程应当也有两个:

对于 f[i]:

  • 如果 nums[i] 被选择,那么 nums[i - 1] 就必然没有被选择,因为被选中的元素所在位置不能是相邻的。那么 g[i - 1] 刚好表示 i - 1 位置未被选择情况下,截止 i - 1 位置最长的预约时长。从而该位置被选择的情况下,相应的 f[i] = g[i - 1] + nums[i]

对于 g[i]:

  • 如果 nums[i] 没有被选择,那么 nums[i - 1] 就存在两种可能,即被选和未被选两种。对于 i 位置而言,仅考虑 i - 1 位置对应的最长时长,而不是 i - 1 位置是否被选中,所以 g[i] = max(f[i - 1], g[i - 1])

3.初始化

既然我们已经得到对于每个 i 位置的状态转移方程,那么我们就不难看出每个 i 节点的状态 f[i] 和 g[i] 都离不开 i - 1 位置的状态值。所以我们结合题意和状态表示,给出 i = 0 位置的初始化:

  • f[0] = nums[0]
  • g[0] = 0

4.填表顺序

通过 < 3.初始化 > 中的描述得知,填表顺序为:

从左往右,两表同填

5.返回值

根据状态表示,i 位置对应的值即为最长预约时间,又因为其有两种状态(被选择和未被选),所以返回值为:

max(f[n - 1], g[n - 1])

示例代码

class Solution {
public:
    int massage(vector<int>& nums) {
        int n = nums.size();
        if(n == 0) { return 0; }
        vector<int> f(n);   // 选nums[i], 最大分钟数
        auto g = f;   // 不选nums[i], 最大分钟数

        f[0] = nums[0];
        g[0] = 0;

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

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

提交结果:

在这里插入图片描述

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

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

相关文章

Linux网络编程:多路转接|select|poll

目录 前言&#xff1a; 1.IO多路转接---select 1.1.接口认识 1.2.select如何进行多路转接 1.3.select多路转接的优缺点 2.IO多路转接---poll 2.1.接口认识 2.2.poll如何进行多路转接 2.3.poll多路转接优缺点 前言&#xff1a; 多路转接&#xff08;也称为IO多路复用&a…

留住马斯克和AI,股价连续大涨,但特斯拉还是贵?

留住马斯克和AI&#xff0c;股价连续大涨&#xff0c;但特斯拉还是贵&#xff1f; 特斯拉股东们花了560亿美元留住马斯克&#xff0c;但特斯拉的前景依旧迷雾重重&#xff0c;估值比一众科技巨头贵&#xff0c;汽车一季度销量疲弱&#xff0c;股价今年来累计下跌29%&#xff0…

mysql导入sql文件失败及解决措施

1.报错找不到表 1.1 原因 表格创建失败&#xff0c;编码问题mysql8相较于mysql5出现了新的编码集 1.2解决办法&#xff1a; 使用vscode打开sql文件ctrlh&#xff0c;批量替换&#xff0c;替换到你所安装mysql支持的编码集。 2.timestmp没有设置默认值 Error occured at:20…

LangChain入门学习笔记(三)—— Model I/O之Prompts

如果说LCEL是粘合剂&#xff0c;那么它需要粘合起来的要素就是各种组件。其中最核心的要素就是LangChain官方文档中定义的Model I/O&#xff1a;Prompts、Chat Models、LLMs和Output Parsers。这4个基本组件&#xff0c;可以处理基本的用户输入并通过大模型处理后按要求输出。 …

SpringBoot的Mybatis-plus实战之核心功能

文章目录 一、条件构造器二、自定义SQL第一步、基于wrapper构建where条件第二步、在mapper中声明变量名称第三步、自定义SQL 本篇继续MybatisPlus核心功能 一、条件构造器 MybatisPlus 支持各种复杂的where条件&#xff0c;可满足日常开发的所有需求。 使用到wrapper构造器&am…

代理服务

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在爬取网页的过程中&#xff0c;经常会出现不久前可以爬取的网页现在无法爬取了&#xff0c;这是因为您的IP被爬取网站的服务器所屏蔽了。此时代理服…

银河麒麟系统安装

新建虚拟机 选择典型下一步&#xff1a; 稍后安装操作系统 下一步 &#xff1a; 选择Linux Ubuntu 64位 下一步&#xff1a; 设置名称 选择一个虚拟机的位置进行下一步&#xff1a; 磁盘大小默认给20G 下一步&#xff1a; 点击完成 编辑虚拟机设置 点击CD/DVD(SATA) 使用IS…

27.设计注入功能界面

上一个内容&#xff1a;26.入口点注入项目搭建 使用 26.入口点注入项目搭建 它的代码为基础进行修改 效果图&#xff1a; 首先设置一些主窗口的边框属性 然后在IDD_PAGE_0里添加一个List Control 再给List Control设置调整大小类型属性 然后再给它添加一个变量 然后在拖入一个…

Linux 线程控制

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 1.线程现象 2.线程等待 3.线程…

AutoCAD 2025 ObjectARX(C++)二次开发环境搭建

&#xff08;原文&#xff1a;https://blog.iyatt.com/?p16480&#xff09; 基本环境 AutoCAD 机械版 2025 Visual Studio 2022&#xff08;需要安装“C 桌面开发”&#xff09; 开发环境 下载 &#xff08;1&#xff09;ObjectARX SDK 下载&#xff08;提供开发使用的 …

MacOS下如何使用Tomcat

提示&#xff1a;宝子们&#xff0c;希望文章对你们有所帮助&#xff0c; 请一键三连支持博主下吧&#xff5e; 文章目录 前言一、Tomcat 压缩版二、Tomcat可执行文件版本最后 前言 电脑环境&#xff1a; MacOS Monterey 版本 12.6.8 Apple M1 Tomcat 9.0.83 Java 1.8.0_171 …

(三十)Flask之wtforms库【剖析源码上篇】

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

收银系统源码-千呼新零售2.0【连锁店财务管理】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

金融与大模型:引领行业未来的创新融合

前言 在数字化浪潮席卷全球的今天&#xff0c;金融与大模型的结合正成为行业发展的新引擎。这种融合不仅为金融机构带来了前所未有的效率和准确性&#xff0c;也为金融市场的稳定与发展注入了新的活力。本文将基于当前的市场现状&#xff0c;结合金融环境的发展&#xff0c;深…

探索大数据在信用评估中的独特价值

随着我国的信用体系越来越完善&#xff0c;信用将影响越来越多的人。现在新兴的大数据信用和传统信用&#xff0c;形成了互补的优势&#xff0c;大数据信用变得越来越重要&#xff0c;那大数据信用风险检测的重要性主要体现在什么地方呢?本文将详细为大家介绍一下&#xff0c;…

【ETABS】Main phrases of ETABS .e2k file and parameter roughly study

文章目录 $ STORIES - IN SEQUENCE FROM TOP$ GRIDS$ MATERIAL PROPERTIESTYPE "Steel"TYPE "Concrete" $ REBAR DEFINITIONS$ FRAME SECTIONS$ CONCRETE SECTIONS$ SLAB PROPERTIES$ WALL PROPERTIES$ POINT COORDINATES$ LINE CONNECTIVITIES$ AREA CONN…

【Python/Pytorch - 网络模型】-- 手把手搭建E3D LSTM网络

文章目录 文章目录 00 写在前面01 基于Pytorch版本的E3D LSTM代码02 论文下载 00 写在前面 测试代码&#xff0c;比较重要&#xff0c;它可以大概判断tensor维度在网络传播过程中&#xff0c;各个维度的变化情况&#xff0c;方便改成适合自己的数据集。 需要github上的数据集…

Vue37-非单文件组件

一、组件的两种编写形式&#xff1a; 非单文件组件&#xff1b;单文件组件。 二、创建一个组件 2-1、组件中的el 组件中不写el&#xff0c;不说为谁服务。 2-2、组件中的data 因为对象形式&#xff0c;多处复用的话&#xff0c;有引用关系&#xff0c;改一处&#xff0c;另一…

6月14日 Qtday2

#include "widget.h" #include "ui_widget.h" #include <QTimer> using namespace std; Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), lab1(new QLabel(this)) //初始化一个标签显示登录状态 {//设置华清远见的标签图…

基于Django、Bootstrap的电影推荐系统,算法基于用户的协同过滤算法,有爬虫有可视化后台

背景 基于Django和Bootstrap的电影推荐系统结合了用户协同过滤算法&#xff0c;通过爬虫技术获取电影数据&#xff0c;并在可视化后台展示推荐结果。该系统旨在提供个性化的电影推荐服务&#xff0c;帮助用户发现符合其喜好的电影。 用户协同过滤算法是一种常用的推荐算法&am…