代码随想录算法训练营第五十天|123.买卖股票的最佳时机III、 188.买卖股票的最佳时机IV

news2024/11/26 0:47:16

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

此题限定了买卖的次数,所以应该用几个状态来记录所对应得利润
至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。

  1. dp数组及下标含义

    一天一共就有五个状态,
    0 没有操作
    1 第一次买入
    2 第一次卖出
    3 第二次买入
    4 第二次卖出
    dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。

  2. 确定递推公式
    需要注意:dp[i][1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是容易陷入的误区。

    • 达到dp[i][1]状态,有两个具体操作:

      • 操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]
      • 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]

      所以dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);

    • 同理dp[i][2]也有两个操作:

      • 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
      • 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]

      所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])

    • 同理可推出剩下状态部分:

      dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);

      dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);

  3. dp数组初始化
    第0天没有操作,就是0,即:dp[0][0] = 0;

    第0天做第一次买入的操作,dp[0][1] = -prices[0];

    第0天做第一次卖出的操作,所以dp[0][2] = 0;

    第0天第二次买入操作,第二次买入依赖于第一次卖出的状态,此时相当于第0天第一次买入了,第一次卖出了,然后在买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少。

    所以第二次买入操作,初始化为:dp[0][3] = -prices[0];

    同理第二次卖出初始化dp[0][4] = 0;

  4. 确定遍历顺序
    从递归公式其实可以看出,从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。

  5. 举例推导dp数组
    以输入[1,2,3,4,5]为例
    在这里插入图片描述

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(prices.size(), vector<int>(5));
        //dp[0][0] = 0;
        dp[0][1] = -prices[0];
        //dp[0][2] = 0;
        dp[0][3] = -prices[0];
        //dp[0][4] = 0;
        for (int i = 1; i < prices.size(); i++) {
            dp[i][0] = dp[i - 1][0];
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
            dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
            dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
            dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
        }
        return dp[prices.size() - 1][4];
    }
};

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

此题为上一题的升级版,将买卖最大次数一般化为k次

首先不同的地方在于初始化,通过上题规律可以看出,当状态j为奇数时为买入,为偶数时为卖出
所以初始化为

        for (int i = 1; i <= 2 * k; i += 2) {
            dp[0][i] = -prices[0];
        }

下一个不同的地方就在于递推公式,同样也是区分奇偶数

        for (int j = 0; j < 2 * k - 1; j += 2) {
            dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]); //对应奇数
            dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]); //对应偶数
        }
class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        if (prices.size() == 0) return 0;
        vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1));
        for (int i = 1; i <= 2 * k; i += 2) {
            dp[0][i] = -prices[0];
        }
        for (int i = 1; i < prices.size(); i++) {
            //自己写的
            // for (int j = 1; j <= 2 * k; j++) {
            //     if (j % 2 == 1) {
            //         dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);
            //     } else if (j % 2 == 0) {
            //         dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i]);
            //     }
            // }
            
            //卡哥处理
            for (int j = 0; j < 2 * k - 1; j += 2) {
                dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]); //对应奇数
                dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]); //对应偶数
            }
        }
        return dp[prices.size() - 1][2 * k];
    }
};

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

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

相关文章

java+mysql 基于ssm的驾校预约管理系统

随着现代驾校预约管理的快速发展,可以说驾校预约管理已经逐渐成为现代驾校预约管理过程中最为重要的部分之一。但是一直以来我国传统的驾校预约管理并没有建立一套完善的行之有效的驾校预约管理系统,传统的驾校预约管理已经无法适应高速发展,无论是从效率还是从效果来看都远远的…

代码随想录Day50|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

文章目录123.买卖股票的最佳时机III188.买卖股票的最佳时机IV123.买卖股票的最佳时机III 文章讲解&#xff1a;代码随想录 (programmercarl.com) 题目链接&#xff1a;123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定一个数组&…

[附源码]Python计算机毕业设计感动校园人物投稿网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

极简入门 2022 docker 部署skywalking9.2.0

安装skywalking服务 官方地址&#xff1a;官网 安装文档&#xff1a;文档地址 拉取镜像 docker pull apache/skywalking-oap-server:9.2.0 docker pull apache/skywalking-ui:9.2.0运行skywalking-oap容器 docker run --name skywalking-oap -e TZAsia/Shanghai -p 12800:1…

ffmpeg的基本用法

title: ffmpeg的基本用法 categories:[ffmpeg] tags:[音视频编程] 一、ffmpeg的安装 1.Centos安装 FFmpeg 在默认的CentOS 8 源仓库中没有提供。你可以选择通过源文件编译安装 FFmpeg&#xff0c;或者使用dnf工具从Negativo17源仓库中安装。我们将会使用第二个选项。 完成…

正大期货数据整合 新鲜事简单报

本周观察重点: &#x1f539;美国11月CPI数据昨晚公布为7.1%&#xff0c;低于市场预期7.3%&#xff0c;较于前值7.7%大幅回落&#xff0c;随通膨回落&#xff0c;静待联准会未来货币政策方向。 12/15 (四) 美国、香港、欧洲、英国、台湾央行12月利率决策会议 12/16 (六) 日本、…

基于java+springboot+mybatis+vue+mysql的小学家校一体作业帮

项目介绍 本系统采用java语言开发&#xff0c;后端采用springboot框架&#xff0c;前端采用vue技术&#xff0c;数据库采用mysql进行数据存储。系统功能如下&#xff1a; 前台&#xff1a; 首页、微社区、试卷、公告通知、个人中心、后台管理 后台&#xff1a; 首页、个人中…

SpringCloud02

1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#xff…

技术分享 | 软件项目管理与跨部门沟通协作

项目管理是在项目活动中运用知识、技能、工具和方法&#xff0c;以便达到项目要求。 软件项目管理有其特定的对象、范围和活动&#xff0c;着重关注成本、进度、风险和质量的管理&#xff0c;还需要协调开发团队和客户的关系&#xff0c;协调内部各个团队之间的关系&#xff0…

怎么把pdf格式转成word文档?如何将 PDF 转换为 Word

怎么把pdf格式转成word文档&#xff1f;PDF是运用得很广泛地的办公文档&#xff0c;但是不能编辑&#xff0c;为了方便编辑&#xff0c;需要将PDF转换为word&#xff0c;那么&#xff0c;如何将 PDF 转换为 Word&#xff0c;下面&#xff0c;易我小编会讲解实用的pdf转word的操…

基于VBA实现电缆结构自动出图(二) —— 单芯线

大家敢相信吗&#xff0c;原来VBA竟然可以实现电缆结构自动出图&#xff0c;换句话说&#xff0c;只要输入数据&#xff0c;VBA会自动将电缆的结构画出来&#xff0c;同时还可以渲染&#xff0c;结果竟然不输画图软件&#xff0c;真真让我刮目相看。这里我就不过多介绍VBA了&am…

传奇登录器列表显示不连接

传奇登录器列表显示不连接 我们打开登录器后列表显示不连接怎么办&#xff1f; 图中有打码部分望读者理解&#xff08;平台gz&#xff09; 以下我们大家说下几种列表显示不连接的几种情况 第一种&#xff1a;列表格式错误 在我们开区的位置默认是127.0.0.1 端口默认7000 如果…

Django captcha验证码应用【亲测可用】

1、下载captcha安装包&#xff1a; pip install django-simple-captcha pip3 install pillow -i Simple Index 2、在settings的INSTALLED_APPS添加: captcha&#xff0c; 3、在控制台执行&#xff1a; 生成迁移文件&#xff1a;python3 manage.py makemigrations 迁移文件…

数据流标准差计算方法-不用事先计算均值

数据流标准差计算方法-不用事先计算均值 挑战 标准差(Standard Deviation)是误差有效值的估计&#xff0c;在信号处理里面代表偏差有效值。公式定义需要事先知道均值&#xff08;引自百度百科&#xff09;&#xff1a; 数据流进来&#xff0c;你事先不知道均值&#xff0c;…

【云原生】k8s中kubectl陈述式资源管理

内容预知 1.k8s陈述资源管理方法的说明 1.1 管理k8s核心资源的三种基本方法 陈述式资源管理方法 声明式资源管理方法 GUI式资源管理方法 1.2 kubectl命令行工具 的说明 2.k8s集群中的基本信息查看 2.1 k8s中基本管理信息的查看 &#xff08;1&#xff09;查看版本信息 …

移动端内webview页面调试技巧

前言 长假七天乐确实很爽&#xff0c;只是疫情不稳定&#xff0c;还是呆在家里安全些&#xff0c; 在这宅在家的七天里&#xff0c;何不找点有趣的小demo耍耍 本期教大家制作一个 能播放M3U8直播源的在线电视台网站&#xff0c; 既能学到知识技术&#xff0c;又可以方便在家…

Vue之iconfont

iconfont的使用1.iconfont的使用2.多个iconfont如何做到不冲突1.iconfont的使用 1.打开iconfont官网链接 链接 2.搜索想要的图标&#xff0c;加入购物车 3.点击最上面一行购物车图标&#xff0c;添加至项目 &#xff08;如果没有项目&#xff0c;请先到 资源管理->我的项目…

B2:Unity制作Moba类游戏——聊天系统

一场游戏对局中&#xff0c;和队友进行友好的有礼貌的有效的沟通可以极大提升对局胜率。在LOL国服&#xff0c;打字和队友聊天沟通战术是非常常见的行为&#xff1a; 语言的力量是无限的&#xff0c;甚至可以和外国小伙伴效沟通战术&#xff1a; 聊天系统制作起来非常简单&…

jQuery图片批量上传插件源码,支持批量上传、预览、删除、放大,可配置上传数量、上传大小、追加方式,含详细使用文档

jQuery图片批量上传插件源码&#xff0c;支持批量上传、预览、删除、放大&#xff0c;可配置上传数量、上传大小、追加方式&#xff0c;含详细使用文档 程序包内含使用Demo 完整程序源代码&#xff1a;jQuery图片批量上传插件源码 上传前 上传后 使用方法 1、先引入jquer…

linux搭建nexus私服仓库并简单使用

linux搭建nexus私服仓库并简单使用1、linux搭建nexus私服仓库1.1、下载安装包1.2、linux安装1.3、启动和关闭1.4、登录控制台1.5、账号与密码2、创建自己的私服仓库3、上传 jar 包4、具体项目引入私服仓库1、linux搭建nexus私服仓库 1.1、下载安装包 下载nexus包&#xff0c;这…