多状态动态规划之买卖股票的最佳时机含手续费

简介: 多状态动态规划之买卖股票的最佳时机含手续费

1. 题目分析



题目链接选自力扣 : 买卖股票的最佳时机含手续费

2bc2c6d16b2358e9e656c39feea50f1b.png

根据示例 1 进行分析 :

4f0cb65ebadc98c9cc0d91d3e269a2b3.png


示例 2 :

image.png


总的来说, 和我们之前的 " 最佳买卖股票 " 有点类似. 遵循以下规则

  1. 当天手上没有股票可以选择不买入
  2. 当天手上有股票可以选择不卖出
  3. 当天手上没有股票可以选择买入
  1. 手上有股票必须卖出才可以进行买入操作
  2. 根据用户的不同操作, 尽可能的获得更多的利润. ( 低价收入高价卖出 )


PS : 这里的买入和卖出只得是一笔交易. 也就是说, 当你买入后再卖出时一瞬间会扣取手续费. 买入时并不会扣除, 只有卖掉股票时才会扣 !


2. 状态表示



以 i 为结尾, 表示从第一天到结束时, 所获得的最大利润

不难发现, 当第 i 天结束的时候, 又有两种情况.


  1. 第 i 天结束时为买入状态

这种情况, 我们以 f[i] 表示, 即从第一天开始到第 i 天结束时, 第 i 天处于买入状态时所获得的最大利润.


  1. 第 i 天结束时为卖出状态

这种情况, 我们以 g[i] 表示, 即从第一天开始到第 i 天结束时, 第 i 天处于卖出转态时所获得的最大利润.


3. 状态转移方程



根据上面两个状态表示可以看出, 这是一个多状态的问题. 因此我们对这两个状态分别进行状态转移方程的分析.

a379b71ba0bbcafac470cc768a856057.png

  1. 第 i 天结束时为买入状态

那么, 如何才能在第 i 天结束时为买入状态呢 ? 那我们就需要观察 i - 1 前一天的状态了.


  1. i - 1 为买入状态, 第 i 天不进行操作, 第 i 天结束后依然为买入状态

这种情况下, 其对应的花费为从第一天到第 i - 1 天结束为买入状态时所获得的最大利润, 对应到状态表示中则为 f[i-1], 第 i 天由于不操作, 最终利润为 f[i-1]


  1. i - 1 为卖出状态, 第 i 天进行买入操作, 第 i 天结束后则为买入状态.


这种情况下, 其对应的花费为从第一天到第 i - 1 天结束为卖出状态时所获得的最大利润, 对应到状态表示中则为 g[i-1], 并且在第 i 天买入, 最终利润为 g[i-1]-prices[i]


最终第 i 天结束时为买入状态的状态表示为 f[i] = Math.max(g[i-1]-prices[i], f[i-1]), 为两种情况下的最大利润.


  1. 第 i 天结束时为卖出状态
  1. i - 1 天为买入状态, 第 i 天进行卖出操作, 第 i 天结束后则为卖出状态


这种情况下, 其对应的花费为从第一天到第 i - 1 天结束为卖出状态时所获得的最大利润, 对应到状态表示中则为 f[i-1], 由于在第 i 天进行卖出, 最终利润为 f[i-1] + prices[i]-fee


  1. i - 1 天为卖出状态, 第 i 天不进行操作, 则第 i 天接受后依然为卖出状态 ( 可交易 )


这种情况下, 其对应的花费为从第一天到第 i - 1 天结束为卖出状态时所获得的最大利润, 对应到状态表示中则为 g[i-1], 由于第 i 天不进行操作. 因此最终利润为 g[i-1]


最终第 i 天结束时为卖出状态的状态表示为 g[i] = Math.max(f[i-1] + prices[i]-fee, g[i-1]), 为两种情况下的最大利润


4. 初始化



根据状态转移方程, f[0] 和 g[0] 在填表时会发生越界错误, 因此需要单独进行初始化.

如果第 1 天结束时为买入状态, 之后整个股票交易就结束了, 此时还没有卖出股票, 手上的利润为 -prices[0] ( 负数 )


如果第 1 天结束时为卖出状态, 之后整个股票交易就结束了, 此时为 0 , 等同于这一天买入后又卖出去了. ( 这句话需要各位好好体会一下 )


5. 填表顺序



根据状态转移方程, 想要知道 i 位置结束时获得的最大利润, 要先知道前一天的最大利润. 因此填表顺序为从左往右


6. 返回值



返回第 n 天结束时, 所获得的最大利润. 对应到我们的状态表示中则为两种不同状态下第 n 天的最大值. 即 Math.max(f[n-1], g[n-1]) ( 注意 n 为数组长度, 和下标的对应关系 )


7. 代码演示



class Solution {
    public int maxProfit(int[] prices, int fee) {
        // 1. 创建 dp 表
        int n = prices.length;
        int[] f = new int[n]; // i 位置结束时为买入状态所获得的最大利润
        int[] g = new int[n]; // i 位置结束时为卖出状态所获得的最大利润
        // 2. 初始化
        f[0] = -prices[0];
        // 3. 填写 dp 表
        for(int i = 1; i < n; i++) {
             f[i] = Math.max(g[i - 1]-prices[i], f[i - 1]);
             g[i] = Math.max(f[i - 1] + prices[i]-fee, g[i - 1]);
        }
        // 4. 确认返回值
        return Math.max(f[n - 1], g[n - 1]);
    }
}


相关文章
|
JSON 数据格式
【异常】com.alibaba.fastjson.JSONException: unclosed string : U
【异常】com.alibaba.fastjson.JSONException: unclosed string : U
2874 0
|
SQL 关系型数据库 数据库
数据库空间之谜:彻底解决RDS for SQL Server的空间难题
【8月更文挑战第16天】在管理阿里云RDS for SQL Server时,合理排查与解决空间问题是确保数据库性能稳定的关键。常见问题包括数据文件增长、日志文件膨胀及索引碎片累积。利用SQL Server的动态管理视图(DMV)可有效监测文件使用情况、日志空间及索引碎片化程度。例如,使用`sp_spaceused`检查文件使用量,`sys.dm_db_log_space_usage`监控日志空间,`sys.dm_db_index_physical_stats`识别索引碎片。同时,合理的备份策略和文件组设置也有助于优化空间使用,确保数据库高效运行。
363 2
|
存储 负载均衡 监控
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
300 1
|
机器学习/深度学习 人工智能 自然语言处理
评测:AI 大模型助力客户对话分析
该评测报告详细介绍了Al大模型在客户对话分析中的应用,涵盖了实践原理、实施方法、部署体验、示例代码及业务适应性。报告指出,该方案利用NLP和机器学习技术,深度解析对话内容,精准识别用户意图,显著提升服务质量与客户体验。实施方法清晰明了,文档详尽,部署体验顺畅,提供了丰富的引导和支持。示例代码实用性强,但在依赖库安装和资源限制方面需注意调整。整体上,该方案能够满足基本对话分析需求,但在特定行业场景中还需进一步定制化开发。
|
消息中间件 数据采集 运维
一份运维监控的终极秘籍!监控不到位,宕机两行泪
【10月更文挑战第25天】监控指标的采集分为基础监控和业务监控。基础监控涉及CPU、内存、磁盘等硬件和网络信息,而业务监控则关注服务运行状态。常见的监控数据采集方法包括日志、JMX、REST、OpenMetrics等。Google SRE提出的四个黄金指标——错误、延迟、流量和饱和度,为监控提供了重要指导。错误监控关注系统和业务错误;延迟监控关注服务响应时间;流量监控关注系统和服务的访问量;饱和度监控关注服务利用率。这些指标有助于及时发现和定位故障。
906 1
|
人工智能 安全
openAI的Red Team
openAI的Red Team
466 3
Vue3选择框选择不同的值输入框刷新变化
Vue3选择框选择不同的值输入框刷新变化
310 5
|
人工智能 数据可视化 数据处理
推荐2款免费开源的标注工具,支持大模型对话标注
【LabelLLM】一款开源免费的大模型对话标注平台,专为优化大型语言模型的数据标注过程设计。支持灵活配置与多模态数据(音频、图像、视频),具备全面任务管理和AI辅助标注功能,大幅提升标注效率与准确性。了解更多请前往https://github.com/opendatalab/LabelLLM 【LabelU】一款轻量级开源标注工具,支持图像、视频、音频的高效标注。特色功能包括多功能图像处理、视频和音频分析等,简易灵活,支持多种数据格式输出。了解更多请前往https://github.com/opendatalab/labelU
3796 11
|
域名解析 缓存 运维
【域名解析DNS专栏】DNS解析策略:如何实现负载均衡与故障转移
【5月更文挑战第23天】DNS在互联网中扮演关键角色,将域名转换为IP地址。本文探讨DNS的负载均衡和故障转移技术,以增强服务可用性和性能。负载均衡包括轮询(简单分配流量)和加权轮询(按服务器处理能力分配)。故障转移通过主备策略和TTL值实现快速切换,确保服务连续性。实践案例展示了在电商网站如何应用这些策略。DNS策略优化可提升网站速度和稳定性,借助云服务和智能工具,DNS管理更加高效。
1853 1
【域名解析DNS专栏】DNS解析策略:如何实现负载均衡与故障转移