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

最近爆火的 Ontology 本体是什么?一文看懂基础概念 + 落地实操 1993 Tom Gruber原版定义:本体是对领域概念化模型的显式形式化规范。1998 Studer完善通用定义:本体是共享、明确、形式化的领域概念模型规范。大白话翻译:本体就是机器能看懂的行业词典+业务规则手册。数据库只管存数据,本体只管定规则,知识图谱是规则+数据结合体。区别于普通开源本体工具,这款国产商用本体平台核心优势:业务沙盘推演、可控业务数据写回、全链路字段级数据血缘审计,适配企业生产级业务落地。 阅读详情

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

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

题目链接:123.买卖股票的最佳时机III,难度:困难
【实现代码】

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if (prices.size() == 1) {
            return 0;
        }
        vector<vector<int>> dp(prices.size(), vector<int>(5, 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][1] = max(dp[i - 1][1], -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.back().back();
    }
};

【解题思路】

动态规划五部曲:

  1. 确定dp数组以及下标的含义:
    一天一共就有五个状态,
  • 0:没有操作 (其实我们也可以不设置这个状态)
  • 1:第一次持有股票
  • 2:第一次不持有股票
  • 3:第二次持有股票
  • 4:第二次不持有股票
    dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。
  1. 确定递推公式
    达到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]);
  1. dp数组如何初始化:dp[0][0] = 0; dp[0][1] = -prices[0]; dp[0][2] = 0; dp[0][3] = -prices[0]; dp[0][4] = 0;
  2. 确定遍历顺序:递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。
  3. 举例推导dp数组

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

题目链接:188.买卖股票的最佳时机IV,难度:困难
【实现代码】

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        if (prices.size() == 0) {
            return 0;
        }
        vector<vector<int>> dp(prices.size(), vector<int>(k * 2 + 1, 0));
        for (int i = 1; i <= k * 2; i += 2) {
            dp[0][i] = -prices[0];
        }
        for (int i = 1; i < prices.size(); i++) {
            for (int j = 1; j <= k * 2; j += 2) {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);
                dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] + prices[i]);
            }
        }
        return dp.back().back();
    }
};

【解题思路】

动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j],j的范围就定义为 2 * k + 1 ,除了0以外,偶数就是卖出,奇数就是买入。
  2. 确定递推公式
    达到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])
  1. dp数组如何初始化:dp[0][j]当j为奇数的时候都初始化为 -prices[0]
  2. 确定遍历顺序:递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。
  3. 举例推导dp数组
GJB设计开发各阶段的文件和记录要求 阅读详情

相关推荐

Linux内核同步原语之队列自旋锁(Queued Spin Lock)深度解析

本文深度解析了Linux内核中的队列自旋锁(Queued Spin Lock)机制。通过对比传统自旋锁的瓶颈,详细阐述了队列自旋锁如何利用紧凑的4字节结构、每CPU节点数组和pending位优化,有效解决多核(SMP)系统中的缓存行乒乓和惊群效应,实现公平、高效的锁等待队列,从而显著提升内核在高并发场景下的可扩展性与性能。

weixin_29205061的博客 305

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

理解了之前两道买卖股票的递推公式原理,这两道题还是很简单的。最后,如果文章有错误,请在评论区或私信指出,让我们共同进步!

Camellia__Wang的博客 1010

WSOLA原理及matlab仿真

WSOLA原理 对于 OLA 算法来说,常常无法保持原信号中的周期性结构,在帧裁剪的过程中,不能保证每一个帧都能覆盖完整周期并保证其相位对齐,会产生相位跳跃失真。 为保证**基频不变**,就要使用 WSOLA 算法。 WSOLA 并不直接在 Ha 处找一帧进行直接拼接,而是在一个区间内寻找与理想帧最接近的一帧进行叠加。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8a234f4fde104fc69a9f3ddb7bcf3014.png?x-oss-process=ima

ManiacLook的博客 3215

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

所以dp[4][4]已经包含了dp[4][2]的情况。选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])操作一:第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i]操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]

wx_xxxx的博客 1014

从零到一:龙芯杯参赛全攻略(含北理工学长经验PDF、B站培训视频与开源代码合集)

本文详细介绍了龙芯杯全国大学生计算机系统能力大赛的参赛全攻略,包括资源整合、技能树构建、团队协作和避坑指南。提供北理工学长经验PDF、B站培训视频与开源代码合集,帮助参赛者从零基础到站上领奖台。重点解析如何高效获取优质资源、避开新手常见陷阱及构建可落地的学习路径,助力普通学生系统学习CPU设计。

weixin_26802933的博客 542

从Stereo-seq原始数据到Seurat对象:华大空间转录组分析流程实战解析

本文详细解析了从Stereo-seq原始数据到Seurat对象的完整分析流程,重点解决华大空间转录组数据处理中的三大痛点:bin_size参数设置、批量处理内存管理及格式转换信息丢失。通过Python的stereopy库和R的SeuratDisk包,实现.gem到.h5ad再到.h5seurat的高效转换,为研究者提供了一套可复用的空间转录组分析解决方案。

weixin_30315723的博客 218

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

JAVA代码编写给定一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成交易。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

Catherinemin的博客 1042

人工蜂群优化算法(ABC)详解:原理、实现与应用

人工蜂群算法(Artificial Bee Colony, ABC)是Karaboga于2005年提出的一种群体智能优化算法,其灵感来源于蜜蜂群体在自然界中高效的采蜜行为。该算法通过模拟雇佣蜂、观察蜂和侦察蜂三种角色的分工协作来寻找最优解。在ABC算法中,每个潜在的解决方案被视为一个“食物源”,其质量由适应度函数评估。雇佣蜂负责在已知优质食物源附近进行局部开采;观察蜂根据雇佣蜂分享的信息,以一定概率选择并跟进优质食物源;侦察蜂则随机探索新区域,防止种群陷入局部最优。

qq_42212808的博客 393

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

例如 dp[i][1] ,并不是说 第i天一定买入股票,有可能 第 i-1天 就买入了,那么 dp[i][1] 延续买入股票的这个状态。一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?

Laulian的博客 875

Python爬虫教程:微博热点话题抓取与社交媒体分析

微博是中国最大的社交媒体平台之一,拥有海量的用户和丰富的讨论话题。通过爬取微博的热门话题和讨论内容,我们可以深入分析用户的兴趣、舆论走势、社会情绪等。通过爬取微博的热点话题和讨论内容,我们可以获得关于当前热门话题的宝贵数据,并基于这些数据进行多种社交媒体分析。本文将通过Python爬虫技术,详细介绍如何抓取微博上的热门话题、话题讨论内容,并进行社交媒体分析。希望本文为你提供了一个全面的微博数据抓取与分析的指南,帮助你在社交媒体数据分析的道路上迈出坚实的第一步。微博上的一些页面内容是静态的,可以直接通过。

2201_76125261的博客 590

YOLOv11涨点改进 | Neck改进篇 | YOLOv11引入 BiFPN双向特征金字塔网络,显著提升了多尺度特征融合效率

本文介绍了基于BiFPN特征融合模块优化的YOLOv11目标检测模型。BiFPN通过双向跨尺度连接和加权特征融合机制,显著提升了多尺度特征融合效率。该方法在COCO数据集上实现了55.1AP的检测精度,同时大幅降低计算成本(减少13-42倍FLOPs)。文章详细解析了BiFPN模块结构、核心代码实现方法,并提供了YOLOv11-BiFPN配置文件的修改指导,为计算机视觉领域提供了一种高效的目标检测解决方案。

Ai缝合怪、助力小伙伴高效发论文 716

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

代码随想录算法训练营第50天 动态规划Part11

Aaron_Yang 843

基于BQ25895RTWR的锂电池充电管理硬件设计

BQ25895 是一款适用于单节锂离子电池和锂聚合物电池的高度集成型 5A 开关模式电池充电管理和系统电源路径管理器件。此类器件支持高输入电压快速充电。低阻抗电源路径对开关模式运行效率进行了优化、缩短了电池充电时间并延长了放电阶段的电池使用寿命。• 移动电源、移动 Wi-Fi 热点。• 便携式互联网器件。

corlin6688的博客 1087

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

day 50

lebowskii的博客 361

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

m0_63617655的博客 494

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

实际上买卖股票3和2思路差不多,但是把不操作的给显示出来,让程序运行更加明显。通过二维数组把i的状态全部出示。

2401_83080774的博客 729

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

这道题一下子就难度上来了,关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。本题是123.买卖股票的最佳时机III 的进阶版。123.买卖股票的最佳时机III。188.买卖股票的最佳时机IV。今天的题目越来越巧妙了。

2301_82038730的博客 798

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

例如 dp[i][1] ,并不是说 第i天一定买入股票,有可能 第 i-1天 就买入了,那么 dp[i][1] 延续买入股票的这个状态。一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?

m0_51671538的博客 169

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

完成。

qq_44119037的博客 573

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

## 代码public:i++) {public:​j < 2 * k;j += 2) {i++) {j += 2) {

kline189的博客 467

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

困难相关标签相关企业给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入:prices = [3,3,5,0,0,3,1,4]输出:6解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3。

嗝~~~~的博客 415

代码随想录算法训练营第50天 | 动态规划 part11 ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

dp想清楚有哪些状态,设计清楚这些状态非常重要。比如这题要求只能交易一次或两次。于是设计以下5种状态

weixin_51674457的博客 436

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

代码随想录算法训练营 打卡博文 第50天

weixin_42286468的博客 227

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

思路: 和之前一样, 数组表示股票价格, 要求最大收益, 但是复杂在了可以交易两次。我最初的思路是在 i 天先求0-i 天买卖一次的最大收益, 再求 i - 最后一天交易一次的最大收益。时间复杂度也是 O(n)。不过看了讲解的一般方法是填一个2维dp数组, 数组的 row 表示第 i 天, column 表示操作, 例如column 0 表示不操作, column 1 表示第一次持有, column2 表示第一次不持有。。。

weixin_43521226的博客 375
上一篇: 代码随想录算法训练营第49天|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II
下一篇: 代码随想录算法训练营第51天|309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值