[Algorithm][动态规划][简单多状态DP问题][买卖股票的最佳时机 III][买卖股票的最佳时机 Ⅳ]详细讲解

目录

  • 1.买卖股票的最佳时机 III
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.买卖股票的最佳时机 IV
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.买卖股票的最佳时机 III

1.题目链接

  • 买卖股票的最佳时机 III

2.算法原理详解

  • 注意:本题为了便于初始化,有较多细节服务于它
  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i天结束之后,所能获得的最大利润
      • 本题,状态表示还可以继续细分:
        • f[i][j]:第i天结束之后,完成了j次交易,处于“买入”状态,此时的最大利润
        • g[i][j]:第i天结束之后,完成了j次交易,处于“卖出”状态,此时的最大利润
          请添加图片描述
    • 推导状态转移方程:本题关系复杂,可以画图辅助

      • f[i][j] = max(f[i - 1][j], g[i - 1][j] - p[i])
      • g[i][j] = max(g[i - 1][j], f[i - 1][j - 1] + p[i])
        • 初始化时,只有g需要特殊处理第一列,而f并不需要
        • 为了避免这种情况,可以将这个状态方程拆成多步,分步执行
          • g[i][j] = g[i - 1][j]
          • if(j - 1 >= 0) g[i][j] = max(g[i][j], f[i - 1][j - 1] + p[i])
            请添加图片描述
    • 初始化:vector<vector<int>> dp[i][[j](n, vector<int>(3, -INF))

      • f[0][0] = -p[0], g[0][0] = 0
      • INF = 0x3f3f3f3f
      • 为什么这里用-INF而不是INT_MIN
        • 因为本题状态方程中,有减法,可能在最开始时,对INT_MIN减一个数,此时会溢出
        • 所以选择-INF,首先它足够小,其次没有溢出风险
          请添加图片描述
    • 确定填表顺序:从上往下,从左往右,两个表一起填

    • 确定返回值:g[n - 1]中的最大值

  • 本题可以吸收积累的知识点
    • 算法里面初始化为无穷:INT_MAX || INT_MIN时,要注意潜在的溢出风险
      • 替换为0x3f3f3f3f || -0x3f3f3f3f即可解决该问题
      • 首先它足够大,其次它没有溢出风险
    • 多个状态方程,其中只有一部分的状态方程需要特殊的初始化,那么可以想办法把这个状态方程拆成多步,分步执行,尝试避免特殊处理初始化

3.代码实现

int maxProfit(vector<int>& prices) 
{const int INF = -0x3f3f3f3f; // 充当"INT_MIN"的角色int n = prices.size();vector<vector<int>> f(n, vector<int>(3, INF));vector<vector<int>> g(n, vector<int>(3, INF));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][j] = g[i - 1][j];if(j - 1 >= 0){g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);}}}int ret = 0;for(int j = 0; j < 3; j++){ret = max(ret, g[n - 1][j]);}return ret;
}

2.买卖股票的最佳时机 IV

1.题目链接

  • 买卖股票的最佳时机 IV

2.算法原理详解

  • 注意:本题为了便于初始化,有较多细节服务于它
  • 本题思路与买卖股票的最佳时机 III几乎一致,无非是限制次数变了
  • 细节:可能k > n / 2,此时开空间时,会多开很多无意义的空间
    • 此时k = min(k, n / 2)可以解决该问题
  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i天结束之后,所能获得的最大利润
      • 本题,状态表示还可以继续细分:
        • f[i][j]:第i天结束之后,完成了j次交易,处于“买入”状态,此时的最大利润
        • g[i][j]:第i天结束之后,完成了j次交易,处于“卖出”状态,此时的最大利润
          请添加图片描述
    • 推导状态转移方程:本题关系复杂,可以画图辅助

      • f[i][j] = max(f[i - 1][j], g[i - 1][j] - p[i])
      • g[i][j] = max(g[i - 1][j], f[i - 1][j - 1] + p[i])
        • 初始化时,只有g需要特殊处理第一列,而f并不需要
        • 为了避免这种情况,可以将这个状态方程拆成多步,分步执行
          • g[i][j] = g[i - 1][j]
          • if(j - 1 >= 0) g[i][j] = max(g[i][j], f[i - 1][j - 1] + p[i])
            请添加图片描述
    • 初始化:vector<vector<int>> dp[i][[j](n, vector<int>(3, -INF))

      • f[0][0] = -p[0], g[0][0] = 0
      • INF = 0x3f3f3f3f
      • 为什么这里用-INF而不是INT_MIN
        • 因为本题状态方程中,有减法,可能在最开始时,对INT_MIN减一个数,此时会溢出
        • 所以选择-INF,首先它足够小,其次没有溢出风险
          请添加图片描述
    • 确定填表顺序:从上往下,从左往右,两个表一起填

    • 确定返回值:g[n - 1]中的最大值

  • 本题可以吸收积累的知识点
    • 算法里面初始化为无穷:INT_MAX || INT_MIN时,要注意潜在的溢出风险
      • 替换为0x3f3f3f3f || -0x3f3f3f3f即可解决该问题
      • 首先它足够大,其次它没有溢出风险
    • 多个状态方程,其中只有一部分的状态方程需要特殊的初始化,那么可以想办法把这个状态方程拆成多步,分步执行,尝试避免特殊处理初始化

3.代码实现

int maxProfit(int k, vector<int>& prices) 
{const int INF = -0x3f3f3f3f; // 替代"INT_MIN"的功能int n = prices.size();// 优化处理细节,避免空间浪费k = min(k, n / 2);vector<vector<int>> f(n, vector<int>(k + 1, INF));vector<vector<int>> g(n, vector<int>(k + 1, INF));f[0][0] = -prices[0], g[0][0] = 0;for(int i = 1; i < n; i++){for(int j = 0; j <= k; j++){f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);// 处理g时,要避免越界g[i][j] = g[i - 1][j];if(j - 1 >= 0){g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);}}}int ret = 0;for(int i = 0; i <= k; i++){ret = max(ret, g[n - 1][i]);}return ret;
}

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

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

相关文章

瑞萨RA8系列教程 | 基于e2s实现RA8串口输出配置

关注星标公众号&#xff0c;不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 串口是最常见的通信方式之一&#xff0c;也是单片机调试最常见的通信接口&#xff0c;也是现在的单片机必备的通信接口&#xff0c;目前&#xff08;2024-05&#xff09;最新、最强…

【香橙派AIpro】开箱测评

1.板子开箱 哟&#xff0c;看起来还不错哦&#xff01;&#xff01;&#xff01; 收货清单&#xff1a; 主板*1 1.5m数据线*1 充电头*1 1.1.充电头 近65W的充电头&#xff0c;不错不错。 1.2.主板 1.2.1.上面 哇噢&#xff0c;还送了2.4/5G的WiFi和蓝牙天线。 emm&#xf…

卷出新高度,直呼太强!时隔三月,YOLO再度进化升级:《YOLOv10—实时端到端目标检测》重磅来袭

真的是不止一次感叹&#xff0c;学习的速度都跟不上发论文出新品的速度。。。。。 继前文YOLOv9发布以来也就不到三个月的时间&#xff0c;YOLOv10就来了&#xff01; 《太卷了&#xff0c;目标检测新成员——YOLOv9: Learning What You Want to LearnUsing Programmable Gra…

吴恩达2022机器学习专项课程C2W2:2.22 多类 softmax softmax与神经网络 softmax的代码改良 多标签分类

目录 多分类问题1.什么是多分类问题2.多分类问题案例3.二分类与多分类的区别 Softmax1. 什么是Softmax2.逻辑回归预测的计算过程3. Softmax预测的计算过程4.Softmax 回归与逻辑回归的关系5. Softmax的损失函数 softmax与神经网络1.设置Softmax层2.Softmax层的计算3.softmax激活…

卸载/删除 Maxask.com,最简单的方法

被绑架的浏览器&#xff0c;太恶心了。 Maxask伪装成了插件&#xff0c;在你搜索网页的时候利用了重定向&#xff0c;导致出现的界面时Maxask的界面&#xff0c;很恶心。 只需要排查正在使用的&#xff0c;如下图有颜色的图表。 删除一个插件&#xff0c;浏览器搜索一下看看有…

mysql数据库安装指南

这里写自定义目录标题 官网下载mysql数据库安装MySQL数据库添加环境变量查看mysql的服务验证是否配置成功 注意&#xff1a;如果用MySQL8的版本安装不成功&#xff0c;可以尝试用MySQL5的版本。MySQL8的版本可能在windows上一直不能启动&#xff0c;经过查询是某个版本的漏洞。…

知识存储概述

文章目录 知识存储概述知识存储方式知识存储基础工具技术发展趋势 知识存储是针对知识图谱的知识表示形式设计底层存储方式&#xff0c;完成各类知识的存储&#xff0c;以支持对大规模图数据的有效管理和计算。知识存储的对象包括基本属性知识、关联知识、事件知识、时序知识和…

linux网卡MAC地址

1、ifconfig命令查看网卡MAC地址 1.1 通过HWaddr或ether字段过滤mac地址 ifconfig | grep HWaddr ifconfig | grep ether [rootlocalhost ~]# /sbin/ifconfig | grep ether 注&#xff1a;有些Linux发行版本的MAC地址字段为HWaddr&#xff0c;有些Linux发行版本的MAC地址字段…

智能未来,触手可及,畅享移动云

目录 一、简介 二、移动云强大优势 1. 强大的网络基础设施 2. 可靠服务 3. 丰富产品线 4. 技术应用 5. 优惠价格策略 三、多商对比 网络优势 四、移动云的未来发展 五、实战应用 5.1 服务器选购 ​编辑5.2 服务器启动 5.3 实例操作 六、移动云的服务优势 6.1 客…

postman教程-5-发送put请求

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了postman发送post请求的方法&#xff0c;本小节我们讲解一下postman发送put请求的方法。 HTTP PUT 请求是一种用于传输数据的网络协议方法&#xff0c;它在客户端和服务器之间的通信中扮演着重…

数据中心、HPC、AI等应用场景互联协议混战哪家强?

生成式人工智能快速发展对算力与存力呈指数需求增长&#xff0c;进一步加剧了算力与存力之间既有矛盾&#xff0c;时代在呼唤更大的运力&#xff08;即计算与存储之间的数据传输&#xff09;--AIGC时代需要更大带宽&#xff0c;更为快速的数据传输路径。 众所周知&#xff0c;P…

香橙派AIpro初体验,详解如何安装Home Assistant Supervised

香橙派AIpro&#xff08;OrangePi AIpro&#xff09;开发版&#xff0c;定位是一块AI开发板&#xff0c;搭载的是华为昇腾310&#xff08;Ascend310&#xff09;处理器。 没想到&#xff0c;这几年的发展&#xff0c;AI开发板也逐渐铺开&#xff0c;记得之前看到华为发布昇腾3…

javascript 防抖 节流

在前端开发中&#xff0c;性能优化是提升用户体验的关键环节。防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;作为两种常见的优化技术&#xff0c;能够有效管理和控制频繁触发的事件&#xff0c;减少不必要的计算和资源消耗。无论是在处理用户输…

基于香橙派 Ai Pro的ROS Qt人机交互软件部署指南

一&#xff0c;前言 最近收到了CSDN的邀请,对香橙派新出的Ai Pro进行测评: 说来也巧&#xff0c;其实香橙派本人对其映像挺深刻的,在2017年左右,本人刚上大学,当时是在淘宝购买树莓派&#xff0c;发现有个叫香橙派的国产板子&#xff0c;性能跟树莓派差不多吧&#xff0c;但是…

数据仓库和数据挖掘基础

文章目录 1. 数据仓库基础知识1.1 数据仓库的基本特性1.2 数据仓库的数据模式1.3 数据仓库的体系结构 2. 数据挖掘基础知识2.1 数据挖掘的分类2.2 数据挖掘技术2.3 数据挖掘的应用过程 传统数据库在联机事务处理(OLTP)中获得了较大的成功&#xff0c;但是对管理人员的决策分析要…

告别低效率||智能BI财务分析软件

在当今信息爆炸的时代&#xff0c;财务数据作为企业运营的核心&#xff0c;其处理和分析的效率直接关系到企业的决策速度和市场竞争力。奥威BI软件凭借其卓越的性能和智能化的分析功能&#xff0c;为企业提供了一套高效、准确的财务分析解决方案。 奥威BI软件在财务分析中的优…

流程引擎之compileflow idea 2024.*插件支持

之前有使用过多种类型工作流&#xff0c;但最近研究工作流引擎对比各有优劣&#xff0c;compileflow内存支持性能不错&#xff0c;但在idea新版本使用的时候发现插件不支持&#xff0c;干脆自己修改源码手撸一个&#xff08;当前版本2024.1验证可用&#xff0c;如果有其他版本不…

5G工业三防平板电脑M195T:高性价比安卓加固手持终端

在工业领域&#xff0c;设备的坚固性和高效性能至关重要。亿道公司推出的全新5G工业三防平板电脑M195T&#xff0c;以其卓越的硬件配置和坚固耐用的设计&#xff0c;成为工业应用的理想选择。M195T不仅搭载了强大的ARM八核架构处理器和Android 11系统&#xff0c;还集成了多种先…

【C语言】文件操作(超级详细)

如果没有文件&#xff0c;我们写的程序的数据都存储在内存中&#xff0c;当程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;下次再运行程序&#xff0c;已经看不到上次运行的数据了&#xff0c;而为了将数据持久性的保存&#xff0c;就需要使用文件。 一、…

电商新力量,四川易点慧电子商务有限公司

在数字化浪潮席卷全球的今天&#xff0c;电子商务行业正以前所未有的速度蓬勃发展。作为这一领域的佼佼者&#xff0c;四川易点慧电子商务有限公司凭借其独特的创新理念和前瞻性的战略布局&#xff0c;成功引领智慧零售新潮流&#xff0c;为行业发展注入了新的活力。 四川易点慧…