当前位置: 首页 > article >正文

算法训练之动态规划(四)——简单多状态问题


♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥

♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥

♥♥♥我们一起努力成为更好的自己~♥♥♥

♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥

♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥

✨✨✨✨✨✨ 个人主页✨✨✨✨✨✨

        在前面的博客中,我们已经练习了很多动态规划类型的题目,但是前面的动态规划仅仅是单独状态的,今天这一篇博客我们一起来探索一下简单多状态动态规划类型的题目~准备好了吗~我们发车去探索奥秘啦~🚗🚗🚗🚗🚗🚗

目录

按摩师(打家劫舍)

打家劫舍Ⅱ

删除并获得点数


按摩师(打家劫舍)

按摩师(打家劫舍)

        前面已经提到了这是一种简单多状态的dp问题,那么这个多状态体现在哪里呢?题目要求不可以接受相邻的预约,那么就说明每一个位置的状态可能是选择的,也可能是没有选择的~这就有两个状态了,那么有两个状态我们应该怎么表示呢?我们可以创建两个dp表,接下来我们结合前面的思想来分析一下这道多状态问题~

分析:

1、状态表示

题目要求:不可以接受相邻的预约,那么每一个预约有选择和不选择这两种状态~我们创建两个dp表来进行表示

        结合这里的题目要求+经验:

        dp1中的dp1[i]表示为到达该位置并且选择该位置预约的最长预约时间~

        dp2中的dp2[i]表示为到达该位置并且不选择该位置预约的最长预约时间~

2、状态转移方程

       我们以离【i】位置最近的状态分析状态转移方程,处理两个dp表

1、dp1【i】选择【i】位置,那么说明前面的位置是一定不可以选择的,那么dp1[i]=dp2[i-1]+nums[i]

2、dp2【i】不选择【i】位置,那么说明前面的位置可以选择、也可以不选择,取两者的最大值~那么dp2[i]=max(dp1[i-1],dp2[i-1]

3、初始化

        我们可以看到,状态转移方程里面有i-1当i=0的时候显然会出现越界的情况,所以我们需要进行初始化

        结合前面如果不想初始化太麻烦,我们可以多申请一些空间,但是事实上这个题目初始化比较简单,直接初始化dp1[0],dp2[0]就可以了,所以我们直接进行初始化~

        dp1[0]就是选择0位置预约, dp2[0]就是不选择0位置预约,那么我们初始化结果就是

                dp1[0]=nums[0],dp2[0]=0

4、填表顺序

        我们这里的逻辑是从前面依次推出后面的,所以填表顺序是从前往后

5、返回结果

      这里返回结果是最后一个位置,最后一个位置有两种情况,一种是选择最后一个位置,一种是不选择最后一个位置,返回两种情况最大值就可以了,即返回max(dp1[n-1],dp2[n-1])

注意点:这里需要处理一下元素个数为0的边界情况

有了前面的分析,代码实现就比较简单了~

代码实现:

class Solution 
{
public:int massage(vector<int>& nums) {//1、创建两个dp表int n=nums.size();//处理边界情况if(n==0) return 0;vector<int> dp1(n);vector<int> dp2(n);//2、初始化dp1[0]=nums[0];dp2[0]=0;//3、填表for(int i=1;i<n;i++){dp1[i]=dp2[i-1]+nums[i];dp2[i]=max(dp1[i-1],dp2[i-1]);}//4、返回结果return max(dp1[n-1],dp2[n-1]);}
};

顺利通过~

打家劫舍Ⅱ

打家劫舍Ⅱ

        这个题目和上一道题目是十分类似的,不过题目多了头尾不能同时选择的条件~那么我们是不是就可以根据【0】位置是否选择来进行区分:

        1、选择【0】位置,显然【1】位置和【n-1】位置都不能进行选择了,但是在【2】~【n-2】这个区间内,我们不就可以随便选择了吗~也就可以使用前面我们打家劫舍的思路了~

        2、不选择【0】位置,显然【1】位置和【n-1】位置都能进行选择,那么在【1】~【n-1】这个区间内,我们就可以随便选择~也就可以使用前面我们打家劫舍的思路了~

这个题目与前面的分析高度类似,就不进行重复分析了~

优化:我们可以把打家劫舍的代码优化成一个函数进行调用~

我们来看看代码实现:

class Solution 
{
public://打家劫舍一int rob1(vector<int>& nums,int left,int right){if(left>right) return 0;//处理不合法情况//也就处理了边界情况//1、创建两个dp表//vector<int> dp1(right-left+1);//vector<int> dp2(right-left+1);//优化:减少映射关系处理,直接申请n个大小空间int n=nums.size();vector<int> dp1(n);vector<int> dp2(n);//2、初始化dp1[left]=nums[left];dp2[left]=0;//3、填表//注意填表范围和顺序for(int i=left+1;i<=right;i++){dp1[i]=dp2[i-1]+nums[i];dp2[i]=max(dp1[i-1],dp2[i-1]);}//4、返回结果//注意返回位置return max(dp1[right],dp2[right]);}int rob(vector<int>& nums) {int n=nums.size();return max(nums[0]+rob1(nums,2,n-2),0+rob1(nums,1,n-1));}
};

顺利通过~

删除并获得点数

删除并获得点数

        这个题目看起来有点难,看题目要求相邻的两个数是不可以同时存在的,这个不就与我们的打家劫舍类似嘛?那么我们怎么将这个题目与打家劫舍联系起来呢?这里是数不能相邻,那么我们就可以把每一个数的累加和保存到一个数组中,利用数组下标就可以找到他~同时数组下标是相邻的,再对这个数组用一次打家劫舍的思想就可以~

        这个题目与前面的动态规划分析高度类似,就不进行重复分析了~

代码实现:

class Solution
{
public:int deleteAndEarn(vector<int>& nums){//预处理//问题转化int n = nums.size();int m = 0;//不要用max命名,容易与算法库max混淆for (auto e : nums){if (e > m)m = e;}vector<int> arr(m + 1);//根据最大数据开辟空间for (auto e : nums){arr[e] += e;//统计数据和}//动态规划//1、创建两个dp表vector<int> dp1(m + 1);vector<int> dp2(m + 1);//2、初始化dp1[0] = arr[0], dp2[0] = 0;//3、填表for (int i = 1; i < m + 1; i++){dp1[i] = dp2[i - 1] + arr[i];dp2[i] = max(dp1[i - 1], dp2[i - 1]);}//4、返回结果return max(dp1[m], dp2[m]);}
};

        顺利通过~

        事实上,我们这里还可以进一步优化,题目给出了数据范围,那我直接创建一个跟最大数据一样的数组就好~

class Solution
{
public://优化版int deleteAndEarn(vector<int>& nums){//1、预处理const int N = 10001;//更加方便写vector<int> arr(N);for (auto e : nums)arr[e] += e;//2、动态规划vector<int> dp1(N);vector<int> dp2(N);dp1[0] = arr[0];dp2[0] = 0;for (int i = 1; i < N; i++){dp1[i] = dp2[i - 1] + arr[i];dp2[i] = max(dp1[i - 1], dp2[i - 1]);}return max(dp1[N - 1], dp2[N - 1]);}
};

        顺利通过~

        当然,还可以进一步优化,如果只有几个数,动态表开辟那么大的空间,还是有点浪费的,我们可以把前面两个方法结合一下~

        最终版:

class Solution
{
public://最终版int deleteAndEarn(vector<int>& nums){//1、预处理const int N = 10001;//更加方便写int m = 0;vector<int> arr(N);for (auto e : nums){arr[e] += e;m = max(m, e);//统计数据和的同时找数组最大值}//2、动态规划vector<int> dp1(m + 1);vector<int> dp2(m + 1);dp1[0] = arr[0];dp2[0] = 0;for (int i = 1; i < m + 1; i++){dp1[i] = dp2[i - 1] + arr[i];dp2[i] = max(dp1[i - 1], dp2[i - 1]);}return max(dp1[m], dp2[m]);}
};

顺利通过~


♥♥♥本篇博客内容结束,期待与各位优秀程序员交流,有什么问题请私信♥♥♥

♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥

✨✨✨✨✨✨个人主页✨✨✨✨✨✨


相关文章:

算法训练之动态规划(四)——简单多状态问题

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

uniapp离线打包提示未添加videoplayer模块

uniapp中使用到video标签&#xff0c;但是离线打包放到安卓工程中&#xff0c;运行到真机中时提示如下&#xff1a; 解决方案&#xff1a; 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目录下; 文档&#xff1a;https://nativesupport.dcloud.net.cn/…...

5. 蓝桥公园

题目描述 小明喜欢观景&#xff0c;于是今天他来到了蓝桥公园。 已知公园有 N 个景点&#xff0c;景点和景点之间一共有 M 条道路。小明有 Q 个观景计划&#xff0c;每个计划包含一个起点 stst 和一个终点 eded&#xff0c;表示他想从 stst 去到 eded。但是小明的体力有限&am…...

机器人零位标定修正流程介绍

如果想看运动学标定可以看看 机器人运动学参数标定, 一次性把运动学参数和零位标定等一起标定求解. 1. 零位标定 零位标定是机器人运动学标定中的一个重要步骤&#xff0c;其目的是校正机器人关节的初始位置误差。以下是需要进行零位标定的主要原因&#xff1a; 制造误差 在机…...

大疆无人机系列知识

目录 知识 开发者文档 &#xff08;上云&#xff09; 无人机的应用 知识 大疆行业无人机接入音视频平台协议详解_大疆无人机 视频流-CSDN博客 开发者文档 &#xff08;上云&#xff09; 上云API 无人机的应用 【大疆无人机地图测绘技术学习&#xff1a;高精度、高效率的…...

深入 C++ 线程库:从创建到同步的探索之旅

目录 创建多线程 获取线程返回值 1.传指针 2.传引用 原子操作 互斥量 互斥量&#xff08;Mutex&#xff09;的基本概念 mutex类型介绍 锁的类型 互斥锁&#xff08;Mutex&#xff09; 自旋锁&#xff08;Spin Lock&#xff09; 读写锁&#xff08;Read - Write Lo…...

【2025年认证杯数学中国数学建模网络挑战赛】A题 解题建模过程与模型代码(基于matlab)

目录 【2025年认证杯数学建模挑战赛】A题解题建模过程与模型代码&#xff08;基于matlab&#xff09;A题 小行星轨迹预测解题思路第一问模型与求解第二问模型与求解 【2025年认证杯数学建模挑战赛】A题 解题建模过程与模型代码&#xff08;基于matlab&#xff09; A题 小行星轨…...

Rust重定义数据库内核:从内存安全到性能革命的破界之路

Rust语言正在颠覆传统数据库开发范式&#xff0c;其独特的所有权系统与零成本抽象能力&#xff0c;为攻克C/C时代遗留的内存泄漏、并发缺陷等顽疾提供全新解决方案。本文通过TiKV、Materialize等新一代数据库核心组件的实践案例&#xff0c;剖析Rust如何重塑存储引擎、查询优化…...

大模型在慢性髓细胞白血病(CML)初治成人患者诊疗中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与 CML 相关知识 2.1 大模型技术原理与特点 2.2 CML 的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模型预测术前风险 3.3 根据预测…...

Matlab 分数阶PID控制永磁同步电机

1、内容简介 Matlab 203-分数阶PID控制永磁同步电机 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

GO语言入门-反射5(结构体的Tag)

12.5 结构体的 Tag 在定义结构体类型时&#xff0c;可以在字段后面加上一个字符串&#xff0c;称为 Struct Tag。Tag 主要用来补充附加信息。 Tag 由多个 key - value 构成&#xff0c;并以空格来分隔&#xff0c;key 和 value 之间用英文的冒号分隔。其格式如下&#xff1a;…...

免费下载 | 2025电力数据资产管理体系白皮书

本文是一份关于2025年电力数据资产管理体系的白皮书&#xff0c;详细阐述了电力数据要素和数据资产管理的现状、挑战、发展进程以及电网数据资产管理体系的构建与实践。白皮书强调了数据作为生产要素的重要性&#xff0c;并提出了电网数据资产管理体系的创新模式&#xff0c;旨…...

4185 费马小定理求逆元

4185 费马小定理求逆元 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;费马小定理 &#x1f4d6; &#x1f4da; import java.util.Scanner; import java.util.Arrays;public class Main {static int[][] a;public static void main(String[] args) {Scanner sc …...

处理Excel表不等长时间序列用tsfresh提取时序特征

我原本的时间序列格式是excel表记录的&#xff0c;每一行是一条时间序列&#xff0c;时间序列不等长。 要把excel表数据读取出来之后转换成extract_features需要的格式。 1.读取excel表数据 import pandas as pd import numpy as np from tsfresh import extract_features mda…...

从keys到SCAN:Redis批量删除的进化之路

标签:Redis、批量删除、前缀匹配、性能优化 一、痛点分析:为什么需要批量删除指定前缀的键? 在 Redis 使用过程中,我们经常会遇到这样的场景: 需要对某一类数据进行清理,例如用户会话、缓存数据等,而这些数据通常以某种前缀命名(如 user:session:*、cache:data:*)。如…...

界面控件DevExpress WinForms v25.1新功能预览 - 聚焦用户体验升级

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…...

卷积神经网络(CNN)基础

目录 一、应用场景 二、卷积神经网络的结构 1. 输入层&#xff08;Input Layer&#xff09; 2. 卷积层&#xff08;Convolutional Layer&#xff09; 3. 池化层&#xff08;Pooling Layer&#xff09; 最大池化&#xff08;max_pooling&#xff09;或平均池化&#xff08;…...

Android Spotify-v9.0.36.443-arm64-Experimental Merged版

Android Spotify 链接&#xff1a;https://pan.xunlei.com/s/VONXTdIv9d4FnAiNMMliIAEJA1?pwdxt7q# Android Spotify-v9.0.36.443-arm64-Experimental Merged版 享受高达256kbps的AAC音频。...

html元素转图像之深入探索 html - to - image:功能、应用与实践

html元素转图像之深入探索 html-to-image&#xff1a;功能、应用与实践 一、引言 使用该插件 需要注意页面上的图片都能正常显示&#xff0c;否则会报错&#xff0c;或生成的图片有误&#xff0c;注意注意。 在当今数字化内容丰富多样的时代&#xff0c;将网页上的特定 HTML…...

LLM之Agent(十六)| MCP已“过时”?Google近期推出Agent2Agent 协议 (A2A)

如今&#xff0c;企业越来越多地构建和部署自主代理&#xff0c;以帮助扩展、自动化和增强整个工作场所的流程 - 从订购新笔记本电脑到协助客户服务代表&#xff0c;再到协助供应链规划。 为了最大限度地发挥代理 AI 的优势&#xff0c;这些代理能够在一个动态的、多代理的生态…...

Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification

Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification 目录 Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification`AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)`功能概述参数解释`AutoModelForSequen…...

网络安全1

一、网络安全的定义与重要性 定义 网络安全&#xff08;信息技术安全&#xff09;&#xff1a;保护计算机系统和网络免受电子攻击的技术和过程&#xff0c;包括保护个人信息和企业数据不被盗窃、破坏或非法访问。涵盖范围&#xff1a;网络设备、数据传输、系统运行安全。 重要…...

Java学习总结-端口-协议

端口号&#xff1a;一个16位的二进制&#xff0c;范围是0-65535 端口分类&#xff1a; 周知端口&#xff1a;0-1023&#xff0c;被预先定义的知名应用占用&#xff08;如&#xff1a;HTTP占用80&#xff0c;FTP占用21&#xff09; 注册端口&#xff1a;1024-49151&#xff0…...

克魔助手(Kemob)安装与注册完整教程 - Windows/macOS双平台指南

iOS设备管理工具克魔助手便携版使用全指南 前言&#xff1a;为什么需要专业的iOS管理工具 在iOS开发和设备管理过程中&#xff0c;开发者经常需要突破系统限制&#xff0c;实现更深层次的控制和调试。本文将详细介绍一款实用的便携式工具的使用方法&#xff0c;帮助开发者快速…...

✅ Ultralytics YOLO 训练(Train)时实时获取 COCO 指标(AP):2025最新配置与代码详解 (小白友好 + B站视频)

✅ YOLO获取COCO指标(4): 训练(Train)启用COCO API评估&#xff08;实时监控AP指标&#xff09;| 发论文必看&#xff01; | Ultralytics | 小白友好 文章目录 一、问题定位二、原理分析三、解决方案与实践案例步骤 1: 在 model.train() 调用中设置 save_jsonTrue步骤 2: 修改 …...

qwen-vl 实现OCR的测试

OCR 技术是数字化时代必不可少的实用工具。以前都依赖专业的公司的专业软件才能完成。成本很高。也正因为如此&#xff0c;我国纸质资料的数字化并不普及。基于大模型的ORC 也许会改变这样的现状。 文本识别&#xff0c;也称为光学字符识别 (OCR)&#xff0c;可以将印刷文本或…...

算法训练之动态规划(五)——简单多状态问题

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

C++ 大数相加(简要版)

#include <algorithm> #include <iterator> class Solution { public:/*** 计算两个数之和* param s string字符串 表示第一个整数* param t string字符串 表示第二个整数* return string字符串*/string solve(string s, string t) {// 处理空字符串的情况&#xf…...

SVMSPro分布式综合安防管理平台-->以S3存储革新,开启智能安防新纪元

SVMSPro分布式综合安防管理平台–>以S3存储革新&#xff0c;开启智能安防新纪元 在数字化转型浪潮下&#xff0c;企业安防管理正面临海量数据存储、跨区域协同以及数据安全的严峻挑战。如何实现高效、弹性、低成本的存储扩容&#xff1f;如何确保关键录像数据万无一失&…...

KV Cache大模型推理加速功能

KV Cache KV Cache是大模型标配的推理加速功能&#xff0c;也是推理过程中&#xff0c;显存资源巨大开销的元凶之一。在模型推理时&#xff0c;KV Cache在显存占用量可达30%以上。 目前大部分针对KV Cache的优化工作&#xff0c;主要集中在工程上。比如著名的VLLM&#xff0c…...