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

news2024/12/23 15:56:26

目录

  • 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.coloradmin.cn/o/1704922.html

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

相关文章

对竞品分析的理解

一、竞品分析是什么 竞品分析即对竞争对手进行分析&#xff0c;是市场研究中的一项重要工作&#xff0c;它可以帮助企业了解竞争对手的产品、策略、市场表现等信息&#xff0c;通过竞品分析可以为自己的产品制定更加精准的策略。 二、为什么要做竞品分析 1.了解市场情况 了解…

如果创办Google

本文是一篇演讲稿&#xff0c;来自于《黑客与画家》一书的作者保罗*格雷厄姆&#xff0c;被称为硅谷创业之父。这是他为14至15岁的孩子们做的一次演讲&#xff0c;内容是关于如果他们将来想创立一家创业公司&#xff0c;现在应该做些什么。很多学校认为应该向学生们传授一些有关…

【DrissionPage爬虫库 1】两种模式分别爬取Gitee开源项目

文章目录 DrissionPage爬虫库简介1. 浏览器操控模式&#xff08;类似于游戏中的后台模拟鼠标键盘&#xff09;2. 数据包收发模式&#xff08;类似于游戏中的协议封包&#xff09; 实战中学习需求&#xff1a;爬取Gitee开源项目的标题与描述解决方案1&#xff1a;用数据包方式获…

【常用的队列总结】

文章目录 队列的介绍Queue队列的基本概念与操作队列的基本概念 常见的队列介绍非阻塞队列LinkedList:ArrayDeque:PriorityQueue: 阻塞队列ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue DelayQueueSynchronousQueue 队列的介绍 Queue队列的基本概念与操作 在 …

Linux用docker安装ElasticsearchSpringBoot整合ES

一. 部署Elasticsearch 1. docker查询docker容器中的es docker search elasticsearch 2. 安装&#xff08;PS&#xff1a;查看自己的springBoot的版本号 对应的es版本安装&#xff09; docker pull elasticsearch:7.6.23. 查看已安装的docker镜像 docker images4. 创建挂…

【会议征稿,SPIE独立出版】第五届计算机视觉和数据挖掘国际学术会议(ICCVDM 2024)

第五届计算机视觉与数据挖掘国际学术会议&#xff08;ICCVDM 2024&#xff09;将于2024年7月19-21日在中国长春举行。此前&#xff0c;ICCVDM系列会议于2020年在中国西安、2021年在中国长沙&#xff08;线上&#xff09;、2022年在中国呼伦贝尔&#xff08;线上线下&#xff09…

【Java】JavaSE概述

1、简介 Java SE&#xff08;Java Platform, Standard Edition&#xff09;是Java技术的核心平台&#xff0c;它提供了Java编程语言、Java虚拟机&#xff08;JVM&#xff09;以及Java核心类库和API。Java SE主要用于开发和部署桌面应用程序、服务器应用程序、命令行工具和嵌入…

DBeaver怎么将编辑栏内容放大

1、窗口–》编辑器–》放大 2、ctrl 3、页面结果展示

前端大师-高级Web开发测验

目录 前言 1.按正确的执行顺序排列脚本 2.哪些说法是正确的&#xff1f;&#xff08;D&#xff09; 3.填写正确的术语 4.程序的输出 5.将资源提示与其定义匹配 6.以下程序的输出是&#xff1f; 7.将PerformanceNavigationTimings按正确的顺序排列 8.将缓存指令与其定义…

【动手学PaddleX】谁都能学会的基于迁移学习的老人摔倒目标检测

本项目使用PaddleX搭建目标检测模块&#xff0c;在一个精选的数据集上进行初步训练&#xff0c;并在另一个老年人跌倒检测的数据集上进行参数微调&#xff0c;实现了迁移学习的目标检测项目。 1.项目介绍 迁移学习是非常有用的方法&#xff0c;在实际生活中由于场景多样&…

【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf

联想笔记本 y9000p创建python工程: 使用langchain支持openai的向量化embedding安装软件包 发现没有openai ,添加软件仓库打开工具窗口 点击设置

osg的了解

osg开发配置与第一个osg程序-CSDN博客 #include <osg/Geode> #include <osg/ShapeDrawable> #include <osgViewer/Viewer> #include <iostream>int main(int argc, char** argv) {std::cout << "Hello, osg!" << std::endl;osg:…

加速模型训练 GPU cudnn

GPU的使用 在定义模型时&#xff0c;如果没有特定的GPU设置&#xff0c;会使用 torch.nn.DataParallel 将模型并行化&#xff0c;充分利用多GPU的性能&#xff0c;这在加速训练上有显著影响。 model torch.nn.DataParallel(model).cuda() cudnn 的配置&#xff1a; cudnn.…

MER 2024 第二届多模态情感识别挑战赛

多模态情感识别是人工智能领域的一个活跃研究课题。它的主要目标是整合多种模态来识别人类的情绪状态。当前的工作通常为基准数据集假设准确的情感标签&#xff0c;并专注于开发更有效的架构。然而&#xff0c;现有技术难以满足实际应用的需求。 清华大学陶建华教授联合中国科学…

体育赛事直播系统源码开发:社区论坛模块如何实现引流与增收双赢

在当今数字化时代&#xff0c;体育直播平台不仅是赛事观看的窗口&#xff0c;更是一个互动和交流的社区&#xff0c;以及是一场关于用户体验、用户粘性以及商业模式创新的综合较量。为了在这片红海市场中脱颖而出&#xff0c;平台必须采取更加精细化和多元化的运营策略。其中&a…

2024最新下载kettle方法

1.点击链接进入官网 Pentaho from Hitachi Vantara download | SourceForge.netDownload Pentaho from Hitachi Vantara for free. End to end data integration and analytics platform. Pentaho Community Edition can now be downloaded from https://www.hitachivantara.…

python中import的搜索路径

文章目录 前言 一 python中import的搜索路径1. python中import的搜索路径先判断是否内置模块根据sys.path查找1.1 脚本当前目录和所属项目目录1.2 环境变量1.3 标准库1.4 .pth 文件1.5 第三方库 2. 解决ModuleNotFoundError 前言 码python时经常会遇到找不到包或者找不到模块的…

Brewer Science将在CS Mantech进行展示

在风景如画的亚利桑那州图森市举办的CS Mantech盛会上&#xff08;2024年5月20日至23日&#xff09;&#xff0c;杰出化合物半导体材料企业Brewer Science&#xff0c;将带来一场名为“化合物半导体制造的创新材料解决方案”的演讲盛宴。这一演讲&#xff0c;定于五月二十一日星…

今日好料推荐(数据资产+数字化案例)

今日好料推荐&#xff08;数据资产数字化案例&#xff09; 参考资料在文末获取&#xff0c;关注我&#xff0c;获取优质资源。 数字化的介绍 数字化&#xff08;Digitization&#xff09;是指将模拟信息转换为数字格式的过程。这一过程包括将文字、图像、音频、视频等信息转…

sqpserver——利用scott库练习内连接(一)

一.查找每个员工的姓名&#xff0c;部门编号&#xff0c;薪水和薪水等级 select emp.ename, emp.deptno, emp.sal, SALGRADE.GRADE from emp join SALGRADE on emp.sal>LOSAL and emp.sal<HISAL; 二.查找每个部门的编号&#xf…