动态规划:17.简单多状态 dp 问题_买卖股票的最佳时机III_C++

 题目链接:

一、题目解析

题目:123. 买卖股票的最佳时机 III - 力扣(LeetCode)

解析:

拿示例1举例:    

    

我们可以如图所示买入卖出股票,以求得最大利润,并且交易次数不超过2次

拿示例3举例: 

不管我们怎么买,最终我们利润总会是负数,所以交易次数为0 

二、算法原理

1、状态表示

我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。 

  状态简单理解就是dp表内某一个值代表的含义。

如何确定状态表示

  • 题目要求

   简单的题目里一般会给出

  • 经验+题目要求

  越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。

  • 分析问题的过程中,发现重复子问题

 分析问题的过程中把重复子问题抽象成我们的状态表示,这个更难理解,一切的基础都是我们先对动态规划算法熟练运用。我也不懂,我们慢慢来。

综上:我们通常会以一个位置为结尾或者开始求得我们想要的答案

那我们的这道题得状态表示是什么样的:

我们以一个位置为结尾来表示

状态暂时表示为:dp[i]:第i天结束之后所有的最大利润

2、状态转移方程

 确定状态表示之后我们就可以根据状态标识推出状态转移方程

  状态转移方程是什么?

不讲什么复杂的,简单来说状态转移方程就是    dp[i][j]等于什么 dp[i][j]=?

  这个就是状态转移方程,我们要做的,就是推出dp[i][j]等于什么

  我们根据状态表示再结合题目+经验去推理转移方程,这一步也是我们整个解题过程中最难的一步

  我们在这道题先简单了解下什么是状态转移方程,之后比较难的题目再细推

  状态转移方程推理:

 我们这个题依然是有两个状态:买入和卖出

我们令买入状态为f[i],卖出状态为g[i],我们可以借此来表示两者之间的关系

但是,题目中说到,我们最多只能交易两次

所以我们可以在买入和卖出两个状态上加上天数

所以,买入表示为f[i][j],卖出表示为g[i][j]

所以更为准确的状态表示为:

  • f[i][j]:第i天结束后,交易j次后的买入的最大利润
  • f[i][j]:第i天结束后,交易j次后的卖出的最大利润

我们画图来推理这两个状态之间的关系:

 这里需要注意的是,我们为什么在买入到卖出时,需要买入状态交易次数减一的那次状态,因为我们由买入到卖出,这就是一次交易过程

状态转移方程:

  • f[i][j]=max(f[i-1][j],g[i-1][j]-price[i])
  • g[i][j]=max(g[i-1][j],f[i-1][j-1]+price[i])

这里卖出状态有一点需要注意,虽然我们写出来其状态为g[i][j]=max(g[i-1][j],f[i-1][j-1]+price[i])

但是当交易次数为1的时候,我们需要给g[i-1][-1]的状态,但是这是不合法的,j必须大于等于1,所以我们可以对卖出状态分开来看。

g[i][j]=g[i-1][j];
if(j-1>=0)
{
g[i][j]max(g[i-1][j],f[i-1][j-1]+price[i]);
}

3、初始化

我们初始化的需要注意的有两个方面:

越界问题

当我们填第一天结束时的状态时,我们需要第0天的状态,但是没有第0天,那么填表时就会越界

我们就需要用初始化解决该问题

我们在第0天时,不可能完成一次或者两次交易,只能是0次,所以为了不让后面的值影响我们填表

我们需要对第0天的第一或者二次交易初始化为-∞

但是,我们在比较时,遇到-∞减去一个数,结果会溢出,因为-∞已经是最小的一个数了

所以我们在这里不能初始化为-∞,可以初始化为-0x3f3f3f3f

这个数能保证我不影响我们填表的同时,又不至于我们结果溢出      

下表映射问题

这里不需要注意什么

4、填表顺序

从做到右,从上到下,两个表同时填写

5、返回值

由于我们最后一天一定是卖出状态才会使利润到达最大,所以我们只需比较最后一天卖出状态的三个交易次数就可以了

三、编写代码

class Solution {
public:int maxProfit(vector<int>& prices) {const int INF=0x3f3f3f3f;int n=prices.size();vector<vector<int>> f(n,vector<int>(3,-INF));auto g=f;f[0][0]=-prices[0];g[0][0]=0;for(int i=1;i<n;i++){for(int j=0;j<3;j++){f[i][j]=max(f[i-1][j],g[i-1][j]-prices[i]);g[i][j]=g[i-1][j];if(j>=1)g[i][j]=max(g[i][j],f[i-1][j-1]+prices[i]);}}int ret=0;for(int i=0;i<3;i++){ret=max(ret,g[n-1][i]);}return ret;}
};

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

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

相关文章

【mysql】ISNULL、NVL、IFNULL和COALESCE函数的使用方法

以下是 ISNULL、NVL、IFNULL 和 COALESCE 函数的详细使用方法&#xff1a; 1. ISNULL SQL Server 和 Sybase 使用 ISNULL 函数来处理空值。 语法&#xff1a; ISNULL(expression, replacement_value)参数&#xff1a; expression&#xff1a;要检查的表达式。replacement_…

二百六十九、Kettle——ClickHouse清洗ODS层原始数据增量导入到DWD层表中

一、目的 清洗ClickHouse的ODS层原始数据&#xff0c;增量导入到DWD层表中 二、实施步骤 2.1 newtime select( select create_time from hurys_jw.dwd_statistics order by create_time desc limit 1) as create_time 2.2 替换NULL值 2.3 clickhouse输入 2.4 字段选择 2.5 …

Git的原理和使用(三)

1. 分支管理 1.1 合并模式 1.1.1 fast forward模式 git log --graph --abbrev-commit 1.1.2 no-ff模式 合并出现问题后需要进行手动修改&#xff1a; 如下图所示&#xff1a; 1.1.3 不使用no-ff模式 git merge --no-ff -m "merge dev2" dev2 1.2 分⽀策略 在实际开…

微服务发布

微服务架构下的灰度发布、蓝绿发布和滚动发布 灰度发布(又名金丝雀发布) 不停机旧版本&#xff0c;部署新版本&#xff0c;低比例流量(例如:5%)切换到新版本&#xff0c;高比例流量(例如:95%)仍走旧版本。通过监控观察确认无问题&#xff0c;逐步扩大范围&#xff0c;慢慢的把所…

多IP访问多网段实验

文章目录 多IP访问多网段实验 多IP访问多网段实验 在当前主机配置多个IP地址&#xff0c;实现多IP访问多网段&#xff0c;记录所有命令及含义 1&#xff0c;环境搭建&#xff1a; [rootlocalhost ~]# mount /dev/sr1 /mnt # 设置ISO虚拟镜像文件文件挂载点&#xff0c;将…

数据分析和可视化python库orange简单使用方法

Orange 是一个基于 Python 的数据挖掘和机器学习库&#xff0c;它提供了一系列可视化工具和算法&#xff0c;用于数据分析、机器学习和数据可视化等任务。 一、主要特点 可视化界面&#xff1a;Orange 提供了直观的可视化界面&#xff0c;使得用户可以通过拖放操作构建数据分…

【python爬虫实战】爬取全年天气数据并做数据可视化分析!附源码

由于篇幅限制&#xff0c;无法展示完整代码&#xff0c;需要的朋友可在下方获取&#xff01;100%免费。 一、主题式网络爬虫设计方案 1. 主题式网络爬虫名称&#xff1a;天气预报爬取数据与可视化数据 2. 主题式网络爬虫爬取的内容与数据特征分析&#xff1a; - 爬取内容&am…

算法(四)前缀和

前缀和也是一个重要的算法&#xff0c;一般用来快速求静态数组的某一连续区间内所有数的和&#xff0c;效率很高&#xff0c;但不支持修改操作。分为一维前缀和、二维前缀和。 重要的前言&#xff01; 不要死记模板&#xff0c;具体题目可能是前缀和、前缀乘积、后缀和、后缀乘…

uniapp scroll-view翻转90度后,无法滚动问题,并设置滚动条到最底部(手写横屏样式)

uniapp scroll-view翻转90度后&#xff0c;无法滚动问题&#xff0c;并设置滚动条到最底部 <template><view class"main"><view style"height: 200px;"></view><view class"btn-main"><view class"send-…

二、Linux 入门教程:开启大数据领域的神奇之旅

Linux 入门教程&#xff1a;开启大数据领域的神奇之旅 在当今这个飞速发展的数字化时代&#xff0c;大数据所具有的重要性正日益凸显出来。而 Linux 作为一种极为强大的操作系统&#xff0c;在大数据这一广阔的领域当中发挥着至关重要、不可或缺的关键作用。倘若你怀有涉足大数…

已解决:ModuleNotFoundError: No module named ‘pip‘

[已解决] ModuleNotFoundError: No module named ‘pip‘ 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 手动安装或升级 pip2. 使用 get-pip.py 脚本3. 检查环境变量配置4. 重新安装 Python 并确保添加到 PATH5. 在虚拟环境中安装 pip6. 使用 conda 安装 pip&…

无人机电机故障率骤降:创新设计与六西格玛方法论双赢

项目背景 TBR-100是消费级无人机头部企业推出的主打消费级无人机&#xff0c;凭借其出色的续航能力和卓越的操控性&#xff0c;在市场上获得了广泛认可。在产品运行过程&#xff0c;用户反馈电机故障率偏高&#xff0c;尤其是在飞行一段时间后出现电机过热、损坏以及运行不稳定…

《深度学习》dlib 人脸应用实例 仿射变换 换脸术

目录 一、仿射变换 1、什么是仿射变换 2、原理 3、图像的仿射变换 1&#xff09;图像的几何变换主要包括 2&#xff09;图像的几何变换主要分为 1、刚性变换&#xff1a; 2、仿射变换 3、透视变换 3&#xff09;常见仿射变换 二、案例实现 1、定义关键点索引 2、定…

OpenHarmony 入门——ArkUI 自定义组件内同步的装饰器@State小结(二)

文章大纲 引言一、组件内状态装饰器State1、初始化2、使用规则3、变量的传递/访问规则说明4、支持的观察变化的场景5、State 变量的值初始化和更新机制6、State支持联合类型实例 引言 前一篇文章OpenHarmony 入门——ArkUI 自定义组件之间的状态装饰器小结&#xff08;一&…

SRAM中的bit-write mask 和 word-write mask选项

1. 概念 bit-write mask&#xff1a; 定义&#xff1a;bit-write mask 允许在写操作中对单个字的每个位&#xff08;bit&#xff09;进行独立的控制。即&#xff0c;在写入操作时&#xff0c;特定的位可以被屏蔽&#xff0c;从而只修改需要变更的位&#xff0c;而不影响其它未…

东方通 TongRDS V2 配置与开机自启指南及 Spring Boot 集成

东方通 TongRDS V2 配置与开机自启指南及 Spring Boot 集成 文章目录 东方通 TongRDS V2 配置与开机自启指南及 Spring Boot 集成一 简述二 配置 cfg.xml1 启用密码访问2 Spring Boot 连接 TongRDS 三 配置 TongRDS 开机自启1 配置 RdsCenter1&#xff09;设置 RdsCenter.servi…

100多种【基于YOLOv8/v10/v11的目标检测系统】目录(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

待更新(持续更新&#xff09;&#xff0c;早关注&#xff0c;不迷路............................................................................... 基于YOLOv8的车辆行人实时检测系统基于YOLOv10的车辆行人实时检测系统基于YOLOv11的车辆行人实时检测系统基于YOLOv8的农…

如何在UE5中创建加载屏幕(开场动画)?

第一步&#xff1a; 首先在虚幻商城安装好Async Loading Screen&#xff0c;并且在项目的插件中勾选好。 第二步&#xff1a; 确保准备好所需要的素材&#xff1a; 1&#xff09;开头的动画视频 2&#xff09;关卡加载图片 3&#xff09;准备至少两个关卡 第三步&#xff1a…

PythonExcel批量pingIP地址

问题&#xff1a; 作为一个电气工程师&#xff08;PLC&#xff09;&#xff0c;当设备掉线的时候&#xff0c;需要用ping工具来检查网线物理层是否可靠连接&#xff0c;当项目体量过大时&#xff0c;就不能一个手动输入命令了。 解决方案一&#xff1a; 使用CMD命令 for /L %…

Es全文检索

全文检索 将非结构化数据中的一部分信息提取出来&#xff0c;重新组织&#xff0c;使其变得有一定结构&#xff0c;然后对此有一定结构的数据进行搜索&#xff0c;从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息&#xff0c;我们称之索引。 …