简单多状态DP问题

这里写目录标题

  • 什么是多状态DP
  • 解决多状态DP问题应该怎么做?
  • 关于多状态DP问题的几道题
    • 1.按摩师
    • 2.打家劫舍Ⅱ
    • 3.删除并获得点数
    • 4.粉刷房子
    • 5.买卖股票的最佳时期含手冷冻期
  • 总结

在这里插入图片描述

什么是多状态DP

多状态动态规划(Multi-State Dynamic Programming, Multi-State DP)问题是动态规划(DP)领域中的一个高级概念,涉及到在算法设计中引入多个状态来描述和解决复杂问题。与传统的单状态DP问题相比,多状态DP问题能够处理更多维度的状态信息,以应对更复杂的决策过程和状态转移关系。

以下是对多状态DP问题的详细介绍,包括定义、特点、常见应用场景和解决方法:

  • 定义
    多状态DP问题是指在动态规划算法中,引入了多个状态变量来描述一个问题的状态空间,并在这些状态之间进行转移来优化目标函数。每个状态变量通常代表了问题的一种不同的维度或特征,共同影响最终的决策过程。

简单定义:
在多状态DP问题中,我们使用一个或多个状态变量来描述问题的当前状态,并通过状态转移方程来找到从初始状态到目标状态的最优解。

  • 特点
    状态空间多维:与单状态DP不同,多状态DP问题中包含多个状态变量,每个状态变量可以是一个离散的值或者一个连续的范围。
    状态转移复杂:状态之间的转移关系可能更加复杂,需要同时考虑多个维度的变化。
    优化目标:目标通常是最小化或最大化一个函数,这个函数依赖于多个状态变量的组合。
  • 常见应用场景
    路径规划:如在地图上寻找从起点到终点的最短路径时,可以使用多个状态来描述不同的交通模式、时间限制等。
    资源分配:如在生产计划中,考虑生产任务的时间、资源消耗、设备状态等多个因素来优化生产计划。
    游戏设计:如在游戏中模拟复杂的状态变化,如角色的技能、装备状态、关卡进展等。
    网络优化:如在网络流问题中,考虑多种流量限制、路由选择等因素来优化网络流量分配。
  • 常见问题类型
    以下是一些典型的多状态DP问题示例:
    背包问题的扩展:如多维背包问题,其中不仅需要考虑物品的重量和价值,还需要考虑物品的其他特性(例如容量、数量限制等)。
    序列比对:如生物信息学中的序列比对问题,涉及对比多个序列的不同状态(如基因序列的匹配和变异)。
    多阶段决策问题:如多阶段投资决策,其中每个阶段的决策会影响后续阶段的状态。

解决多状态DP问题应该怎么做?

解决方法
解决多状态DP问题通常包括以下几个步骤:

  1. 定义状态变量:确定问题中的所有状态变量及其可能的取值范围。
  2. 构建状态转移方程:描述从一个状态转移到另一个状态的规则,通常包括状态之间的转移条件和代价。
  3. 设定初始状态和目标状态:确定动态规划的起始状态和目标状态,以及需要优化的目标函数。
  4. 编写DP递推公式:根据状态转移方程编写DP算法的递推公式。
  5. 实现DP算法:使用编程语言实现DP算法,并进行优化以提高算法的效率。

关于多状态DP问题的几道题

1.按摩师

题目链接
问题:

在这里插入图片描述

样例输出和输入:

在这里插入图片描述

这道题题意很简单一个按摩师,可以接收源源不断的预约请求,但是有一点他的预约请求不能在相邻的两天,意思就是我们看示例1,我们如果接受了1,那么就不能接受2,但是 可以接收3,3是可接受,但是不是一定要接受,最后让我们求预约的最长的时长的总和。
算法原理
状态表示:dp[i]表示到达i位置的最长预约时长。
状态转移方程 :这里我们想,到达i位置我们是不是有两种子状态,一种是预约,一种是不预约,如果预约话前一个i-1就不能预约,因为相邻的两个不能同时预约,所以我们将预约这种状态定义为f[i],将不预约这种状态定义为g[i],这里表示预约和不预约的最长预约时间。
所以这里第一种情况:当接受i位置的预约时,我们就不能接受i-1位置的预约,则f[i]可以表示为:f[i]=g[i-1]+nums[i]
第二种情况:当不接受i位置的值的时候,i-1位置可以选,可以不选,所以这里求选和不选的最大值,g[i]=max(g[i-1],f[i-1])
代码展示:

class Solution {
public:int massage(vector<int>& nums) {if(nums.size()==0){return 0;}//讨论两种情况,选或者不选int n = nums.size();vector<int> f(n), g(n);//初始化f[0] = nums[0], g[0] = 0;for (int i = 1;i < n;i++){f[i] = g[i - 1] + nums[i];g[i] = max(g[i - 1], f[i - 1]);}return max(g[n - 1], f[n - 1]);}
};

运行结果:
在这里插入图片描述

2.打家劫舍Ⅱ

题目链接
问题:

在这里插入图片描述

样例输出和输入:

在这里插入图片描述

这道题讲的是一个小偷,他要偷东西,但是不能偷相邻两个房间的东西,因为偷相邻两个房间的东西会触发报警器,还有一个要求就是不能同时偷头尾两个位置的东西,然后数组中的值代表房间的价值。最后让我们求可以偷到的最高价值。
算法原理:

这道题其实和打家劫舍1一样,只需要多一个判断,判断第一个位置是否偷,如果第一个位置偷,则第二个位置不能偷,如果 第一个位置不偷,则第二个位置可以偷 也可以不偷。
然后对可以偷的部分来一次打家劫舍1就可以了。
代码展示:

class Solution {
public:int rob(vector<int>& nums) {int n=nums.size();//三种情况当中偷最大的if(n==1){return nums[0];}if(n==2){return max(nums[0],nums[1]);}if(n==3){return max(max(nums[0],nums[1]),nums[2]);}//如果选第一个位置vector<int> f1(n),g1(n);f1[2]=nums[0]+nums[2],g1[2]=nums[0];for(int i=3;i<n-1;i++){f1[i]=g1[i-1]+nums[i];g1[i]=max(g1[i-1],f1[i-1]);}vector<int> f2(n),g2(n);f2[1]=nums[1],g2[1]=0;for(int i=2;i<n;i++){f2[i]=g2[i-1]+nums[i];g2[i]=max(g2[i-1],f2[i-1]);}return max(max(f1[n-2],g1[n-2]),max(g2[n-1],f2[n-1]));}
};

运行结果:
在这里插入图片描述

3.删除并获得点数

题目链接
问题:

在这里插入图片描述

样例输出和输入:

在这里插入图片描述

这道题让我们求的是最大点数,我们先看第一个例子,如果我们选了3,我们则不能选4和2,因为4和2不满足要求。如果我们选择4,我们则不能选择3但是我们可以选择2,这样最大的点数就是6
算法原理:
先对数组进行排序,升序数组利于我们跳过,然后再创建一个辅助数组,辅助数组的大小是原数组中最大的那个数加1,这个辅助数组的用途就是 存数组中的所有的数,如果 有相同的数则相加存起来,如果没有的话,则初始化为0.
状态表示:dp[i]表示i位置的当前获得的最大点数。。
状态转移方程:这里到达i位置的时候有两种情况,选或者不选,所以我们又需要两种状态来表示,这里选f[i],不选g[i],这里如果我们选第i个位置则前后位置都不能选则f[i]=g[i-1]+arr[i]如果我们不选i位置,则i-1位置可以选也可以不选,就是求选和不选的最大值:g[i]=max(g[i-1],f[i-1])

代码展示:

class Solution {
public:int deleteAndEarn(vector<int>& nums) {sort(nums.begin(), nums.end());int n = nums.size();vector<int> arr(nums[n - 1]+1);for (int i = 0;i < nums.size();i++){arr[nums[i]] += nums[i];}vector<int> f(arr.size()), g(arr.size());f[0] = arr[0], g[0] = 0;//f[0]=2,g[0]=0for (int i = 1;i < arr.size();i++){f[i] = g[i - 1] + arr[i];g[i] = max(g[i - 1], f[i - 1]);}return max(g[arr.size() - 1], f[arr.size() - 1]);}
};

运行结果:
在这里插入图片描述

4.粉刷房子

题目链接
问题:

在这里插入图片描述

样例输出和输入:

在这里插入图片描述

这道题首先要读懂题,这道题给出二维数组costs[i][j],i表示有多少个房子,然后j表示三种颜色,三种颜色分别是红蓝绿,但是这三种颜色 不能涂在相邻两个格子中,最后让我们求最小的花费
算法原理:
状态表示:dp[i]表示图到第i个房间的最小的花费
状态转移方程:这里由于涉及到三种颜色,这三种颜色分别是三种状态,所以这里我们开辟一个二维数组,这个二维数组的大小是n*3,0表示红色,1表示蓝色,2表示绿色。这里当我们第i个房间,这里我们先对红色进行讨论,由于第n个房间图了红色,所以我们的前一个房间就不能图红色,就只能在蓝色和绿色中选一个颜色,所以这里的最小花费应该是i-1的蓝色和绿色的最小花费中的最小的一个再加上当前位置的红色的最小花费:dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i][0]
其余的也一样:dp[i][1]=min(dp[i-1][0],dp[i-1][2])+costs[i][1],dp[i][2]=dp[i-1][1]+dp[i-1][0])+costs[i][2]

代码展示:

class Solution {
public:int minCost(vector<vector<int>>& costs) {int m = costs.size();int n = costs[0].size();vector<vector<int>> dp(m, vector<int>(n, 0));dp[0][0] = costs[0][0], dp[0][1] = costs[0][1], dp[0][2] = costs[0][2];for (int i = 1;i < m;i++){dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i][0];dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i][1];dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + costs[i][2];}return min(min(dp[m - 1][0], dp[m - 1][1]), dp[m - 1][2]);}
};

运行结果:
在这里插入图片描述

5.买卖股票的最佳时期含手冷冻期

题目链接
问题:

在这里插入图片描述

样例输出和输入:

在这里插入图片描述

这道题要我们求是最大的股受益,第一个示例,如果我们买入第一个股票在2的时候卖出则就不能在在3时买入,因为卖出的往后一天处于冷冻期,所以这里我们不能买入股票,冷冻期一过,我们就可以买入股票,我们在0的时候买入一支股票,然后在2的时候卖出,则最大受益就是3.
算法原理:
状态表示:dp[i]表示到达当前位置时的最大利润
状态转移方程:当我们到达i位置时,我们有三种状态,第一种状态是买入(持有股票) ,第二种状态是卖出(未持有股票),第三种状态是冷冻期(冷冻期,不能购买股票)。这三种状态我们分别用0,1,2表示,所以这里我们就可以用一个二维DP表来表示这个dp模型。
在这里插入图片描述
根据上图,我们可以得出简单的状态转移方程,dp[i][0]=max(dp[i-1][1]-prices[i],dp[i-1][0]]),dp[i][0]=max(dp[i-1][2],dp[i--1][1],dp[i][2]=dp[i-1][0]+prices[i]
代码展示:

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n, vector<int>(3, 0));//0买入状态,1可交易状态,2冷冻期dp[0][0] = -prices[0], dp[0][1] = 0, dp[0][2] = 0;for (int i = 1;i < n;i++){dp[i][0] = max(dp[i - 1][1] - prices[i], dp[i - 1][0]);dp[i][1] = max(dp[i - 1][2], dp[i - 1][1]);dp[i][2] = dp[i - 1][0] + prices[i];}//如果最后一次交易手里还剩有股票,那么肯定不是最大的利润return max(dp[n - 1][1], dp[n - 1][2]);} 
};

运行结果:
在这里插入图片描述

总结

在本文中,我们深入探讨了多状态动态规划(DP)问题的核心概念、应用场景和解法技巧。通过分析多状态DP问题的基本结构和挑战,我们不仅回顾了经典的动态规划方法,还揭示了如何在复杂的问题中引入多个状态来实现高效求解。

从具体的算法设计到实际应用案例,我们讨论了如何构建状态转移方程、优化空间复杂度以及处理状态之间的依赖关系。这些高级技巧不仅帮助我们解决了特定的多状态DP问题,也为应对未来更为复杂的算法问题奠定了坚实的基础。

多状态DP不仅是解决动态规划问题的有力工具,更是我们在算法设计中应对多维复杂性的重要思路。通过对这一领域的深入了解,我们可以更好地应对实际问题中的挑战,并在算法竞赛、数据分析等领域中取得突破性进展。

希望本文的讨论能够激发你对多状态动态规划问题的兴趣,鼓励你进一步探索这一领域的高级技巧与创新方法。算法的世界充满了无限可能,而多状态DP问题则是我们探索这片领域的一把重要钥匙。

感谢你的阅读,希望你能从中获得新的启发与收获!

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

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

相关文章

vue2实例实现一个初步的vue-router

vue2实例实现一个初步的vue-router 实现源码&#xff1a;vue2-review 1.App.vue 2.router目录下的index.js 3.自己实现的x-router.js 4.自己实现的xrouter-view.js 5.自己实现的xrouter-link.js 6.效果 微信公众号&#xff1a;刺头拾年

AI奥林匹克竞赛:Claude-3.5-Sonnet对决GPT-4o,谁是最聪明的AI?

目录 实验设置 评估对象 评估方法 结果与分析 针对学科的细粒度分析 GPT-4o vs. Claude-3.5-Sonnet GPT-4V vs. Gemini-1.5-Pro 结论 AI技术日新月异&#xff0c;Anthropic公司最新发布的Claude-3.5-Sonnet因在知识型推理、数学推理、编程任务及视觉推理等任务上设立新…

【雷达原理】雷达测角原理及实现方法

目录 一、雷达测角原理1.1 测角研究历史和现状1.2 测角方法总结1.3 3DFFT测角1.3.1 基本原理1.2.2 测角性能 二、MATLAB仿真案例参考文献 一、雷达测角原理 1.1 测角研究历史和现状 &#xff08;1&#xff09;早期采用窄波束对准目标&#xff0c;目标的角度对应于天线的角度读…

【动态规划】139. 单词拆分

139. 单词拆分 难度&#xff1a;中等 力扣地址&#xff1a;https://leetcode.cn/problems/word-break/description/ 问题描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字…

INS-GPS组合导航——卡尔曼滤波

系列文章目录 《SAR笔记-卫星轨道建模》 《SAR笔记-卫星轨迹&#xff08;三维建模&#xff09;》 《常用坐标系》 文章目录 前言 一、经典卡尔曼滤波 二、扩展卡尔曼滤波 三、无迹卡尔曼滤波 总结 前言 SAR成像仪器搭载于运动平台&#xff0c;平台的自定位误差将影响SAR…

LeetCode-Leetcode 1120:子树的最大平均值

LeetCode-Leetcode 1120&#xff1a;子树的最大平均值 题目描述&#xff1a;解题思路一&#xff1a;递归解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一棵二叉树的根节点 root&#xff0c;找出这棵树的 每一棵 子树的 平均值 中的 最大 值。 子…

还不知道工业以太网和现场总线区别???

工业以太网 工业以太网是一种专为工业环境设计的网络通信技术&#xff0c;它基于标准的以太网技术&#xff0c;但针对工业应用进行了优化。工业以太网能够适应高温、低温、防尘等恶劣工业环境&#xff0c;采用TCP/IP协议&#xff0c;与IEEE 802.3标准兼容&#xff0c;并在应用层…

Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天&#xff0c;回溯算法part03&#xff0c;牢记回溯三部曲&#xff0c;掌握树形结构结题方法&#x1f4aa; 目录 93.复原IP地址 78.子集 90.子集II 总结 93.复原IP地址 文档讲解&#xff1a;代码随想录复原IP地址 视频讲解&#xff1a;手撕复原IP地址 题目&#xff1…

如何利用python画出AHP-SWOT的战略四边形(四象限图)

在企业或产业发展的相关论文分析中&#xff0c;常用到AHP-SWOT法进行定量分析&#xff0c;形成判断矩阵后&#xff0c;如何构造整洁的战略四边形是分析的最后一个环节&#xff0c;本文现将相关代码发布如下&#xff1a; import mpl_toolkits.axisartist as axisartist import …

解决本机电脑只能通过localhost访问,不能通过127.0.0.1访问

背景问题 有天我启动项目&#xff0c;发现项目连接Mysq总是连接不上&#xff0c;查了url、ip、port、用户名和密码都没有错&#xff0c;就是连接不上mysql数据库&#xff0c;后来通过查找资料发现有多个进程占用3306端口。 pid 6016 是mysqld服务 而pid 9672 是一个叫 svchos…

逆变器--学习笔记(一)

并网&#xff1a; 逆变器中的“并网”指的是逆变器将其产生的交流电与电网同步&#xff0c;并输送到公共电网中。并网逆变器通常用于太阳能发电系统和其他分布式发电系统&#xff0c;将其产生的电能输送到电网供其他用户使用。 THD谐波失真总量: 逆变器的THD&#xff08;Tot…

大模型系列课程学习-基于2080TI-22G魔改卡搭建双卡大模型训练平台(双系统)

1.选择合适的硬件配置 再配置电脑之前&#xff0c;需要确认自己需要的显存大小、主板、内存条、电源、散热等核心配件。经过前期调研&#xff0c;选择的硬件配置如下&#xff1a; &#xff08;1&#xff09;主板&#xff1a;华南X99_F8D(DDR4主板)&#xff0c;因为需要支持双卡…

Python: PyCharm 2023.1 调试

1.设断点 &#xff08;行号对应的红色点&#xff0c;在需要设置断点的代码行与行号之间鼠标点击即可以设置&#xff09; 2.shiftF9,或 altshiftf9 选择文件 或是在菜单 Run->debug "main" 或是在菜单Run->debug 选择文件 &#xff08;鼠标光标放在设置第一个…

DDD学习笔记四

领域模型的构建 基础领域模型的基本组成有名称、属性、关联、职责、事件和异常 发掘领域概念3种策略&#xff1a; 1&#xff09;学习已有系统&#xff0c;重用已有模型 2&#xff09;使用分类标签。分类标签来源于领域&#xff0c;需要我们研究一些资料并做一些提炼。从采用5W…

基于elastic stack的docker-compose部署的ELK与LDAP集成

说明&#xff1a; ldap信息配置到es配置文件上&#xff0c;然后kibana读取es的配置信息 用户与角色的关系通过role_mapping.yml文件配置获取 角色与权限的关系通过elastic stack提供的DevTools或API进行维护 一、前置条件&#xff1a; 1.1 es已开启xpack&#xff08;已开启…

DIY智能音箱:基于STM32的低成本解决方案 (附详细教程)

摘要: 本文详细介绍了基于STM32的智能音箱的设计与实现过程&#xff0c;包括硬件设计、软件架构、语音识别、音乐播放等关键技术。通过图文并茂的方式&#xff0c;结合Mermaid流程图和代码示例&#xff0c;帮助读者深入理解智能音箱的工作原理&#xff0c;并提供实际操作指导。…

汇川CodeSysPLC教程03-2-10 如何组态

大家好&#xff0c;我是阿凡工控分享&#xff0c;本期我们将调整教程的顺序&#xff0c;和粉丝朋友们讨论后&#xff0c;后续我将优先出绿旗标注的部分&#xff0c;便于小白水平的你循序渐进&#xff0c;其他水平的朋友有些需求可能要稍后了&#xff0c;如果有问题请见谅&#…

【Spring成神之路】一次SpringIOC源码之旅,女朋友也成为了Spring大神!

文章目录 一、前言二、前置准备三、IOC容器的使用四、Spring IOC源码解读1. prepareRefresh源码解读2. obtainFreshBeanFactory源码解读2.1 refreshBeanFactory源码解读 3. prepareBeanFactory源码解读4. postProcessBeanFactory源码解读5. invokeBeanFactoryPostProcessors源码…

计算机Java项目|基于SpringBoot的作业管理系统设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

Lumos学习王佩丰Excel第三讲:查找替换定位

一、查找和替换 1、按值查找 2、按格式查找 将红色的单元格替换成黄色的单元格&#xff0c;其他格式同理处理。 3、是否开启单元格匹配 若不打开选项卡直接全部替换&#xff0c;会出现“苏州市市”的情况&#xff1b;加入单元格匹配的规则&#xff0c;检索时会以整个单元格内…