跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

动态规划:买卖股票的最佳时机 III

讲解如何使用动态规划解决买卖股票的最佳时机 III 问题。核心在于定义状态 f[i][j] 和 g[i][j] 分别表示第 i 天完成 j 次交易后处于买入或卖出状态的最大利润。通过状态转移方程更新每日最大收益,注意初始化负无穷大防止越界及溢出。最终返回卖出状态表中的最大值即为结果。代码使用 C++ 实现。

SparkGeek发布于 2026/3/27更新于 2026/9/257 浏览
动态规划:买卖股票的最佳时机 III

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

题目链接


2. 题目解析

(此处原文包含图片,已移除)


3. 算法原理

状态表示: 以某一个位置为结尾或者以某一个位置为起点。dp[i] 表示:第 i 天结束之后,此时的最大利润。两种情况:

  1. f[i][j] 表示:第 i 天结束之后,完成了 j 次交易,处于买入状态,此时的最大利润。
  2. g[i][j] 表示:第 i 天结束之后,完成了 j 次交易,处于卖出状态,此时的最大利润。

状态转移方程: 在第 i-1 天处于买入状态,看买入状态能不能到自己,看卖出状态能不能到买入状态,另一个状态也是如此,一共 4 种状态。

  1. f[i][j] = max(f[i-1][j], g[i-1][j] - prices[i])
  2. g[i][j] = max(g[i-1][j], f[i-1][j-1] + prices[i])

初始化: 把 dp 表填满不越界,让后面的填表可以顺利进行。因为是在第 i-1 天处于买入/卖出状态,所以当交易次数为 0 时,就相当于在第 i 天为 -1,那么就会导致越界。所以我们可以修改一下第二个状态转移方程来判断一下,我们可以看到卖出状态到自己的情况是不会改变的,所以只用修改买入状态到卖出状态:

  1. g[i][j] = g[i-1][j](此状态一定不会越界)
  2. if(j-1>=0) g[i][j] = max(g[i][j], f[i-1][j-1] + prices[i])

在查找 f[i-1][j-1] + prices[i] 状态的时候先判断一下下标是否合法 (if(j-1>=0)),然后再求 max。 定义一个正无穷大/小的时候涉及到需要进行加减操作的时候,不要使用 INT_MIN/MAX,因为如果 INT_MIN 减去一个数的话就会变成一个非常大的整数而导致溢出,所以我们最好用 +/- 0x3f3f3f3f 来表示最小值。 本题初始化就是先将表里的所有值都初始化为 - 无穷大,再把 f[0][0] = -prices[0], g[0][0] = 0。

填表顺序: 本题的填表顺序是:从上往下填写每一行,每一行从左往右,两个表同时填。

返回值: 题目要求 + 状态表示。因为是要最大利润,所以买入状态不用考虑。本题的返回值是:g 表里最后一行里面的最大值。


4. 代码

动态规划的固定四步骤:

  1. 创建一个 dp 表
  2. 在填表之前初始化
  3. 填表(填表方法:状态转移方程)
  4. 确定返回值
class Solution {
public:
    const int INF = 0x3f3f3f3f; // 将无穷大赋予给 INF
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        // 1. 创建 dp 表
        
        vector<vector<>> (n, <>(, -INF));
         g = f;
        
        f[][] = -prices[];
        g[][] = ;
        
        ( i = ; i < n; i++) {
            ( j = ; j < ; j++) 
            {
                f[i][j] = (f[i][j], g[i][j] - prices[i]);
                g[i][j] = g[i][j];
                (j >= ) g[i][j] = (g[i][j], f[i][j] + prices[i]);
            }
        }
        
         ret = ;
        ( j = ; j < ; j++) ret = (ret, g[n][j]);
         ret;
    }
};
// 3:交易次数的三列:0,1,2,再将所有的位置都变成负无穷大
int
f
vector
int
3
auto
// 2. 在填表之前初始化
0
0
0
0
0
0
// 3. 填表(填表方法:状态转移方程)
for
int
1
for
int
0
3
// j 只有 0,1,2 三种状态
max
-1
-1
-1
if
1
max
-1
-1
// g 表里最后一行里面的最大值
int
0
for
int
0
3
max
-1
return

目录

  1. 1. 买卖股票的最佳时机 III
  2. 2. 题目解析
  3. 3. 算法原理
  4. 4. 代码

更多推荐文章

查看全部
  • OpenClaw Web UI 访问报错 Not Found 排查与修复
  • ComfyUI 运行 Wan 2.1 工作流:生成电影级视频(兼容 Mac/Windows)
  • ChatGPT-4o 发布:AI 大模型迈入感知时代
  • Python FastAPI 入门实战:从零构建 API 服务
  • 企业级风控接入:天远车辆出险查询API Java 集成指南
  • 企业级图像 AIGC 技术观察:Seedream 4.0 模型能力与应用场景
  • OpenClaw 在 Mac 上本地化部署及接入飞书教程
  • Qwen3-32B 模型部署:使用 Clawdbot 网关实现 WebSocket 长连接
  • DeepSeek-R1 大模型基于 MS-Swift 框架部署推理与微调实践
  • 二分查找算法进阶:山脉数组与旋转排序
  • CCF-CSP 认证:机器人复健指南题解
  • Dify 工作流集成 Sambert-Hifigan 语音合成 API 实现对话机器人
  • Python 搭建具备记忆与人工干预的 Agent 机器人
  • 基于 WebRTC 与 AI 接口的实时语音对话系统构建
  • Java 工业级多级缓存架构设计与落地(Redis 客户端+Redisson 方案)
  • 机器人实践开发①:Foxglove 开发环境完整搭建指南
  • C++ 智能指针:示例、原理与适用场景详解
  • MCP 工具速成:npx 与 uvx 全流程安装指南
  • 提示词工程(Prompt Engineering)核心概念与实战指南
  • ToClaw 上手:当 AI 开始在桌面上替你执行任务

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online