Leetcode 188. 买卖股票的最佳时机 Ⅳ 状态机dp C++实现

news2024/11/13 12:10:11

Leetcode 188.买卖股票的最佳时机 Ⅳ

问题:给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

算法:递归搜索 + 保存计算结果 = 记忆化搜索

        在 Leetcode122. 买卖股票 状态机dp C++实现 的基础上,添加一个参数 j,表示当前可以至多交易 j 次。

注意:由于最后未持有股票,手上的股票一定会卖掉,所以代码中的 j-1 可以是在买股票的时候,也可以是在卖股票的时候,这两种写法都是可以的。

以下代码参数 j 的修改时机为买入时。

时间复杂度:O(nk),其中 n 为 prices 的长度。

空间复杂度:O(nk)

代码:

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        vector<vector<array<int, 2>>> memo(n, vector<array<int, 2>>(k + 1, {-1, -1})); // -1 表示还没有计算过
        auto dfs = [&](auto&& dfs, int i, int j, bool hold) -> int {
            if (j < 0)  return INT_MIN / 2; // 除 2 防止溢出
            if (i < 0)  return hold ? INT_MIN / 2 : 0;

            int& res = memo[i][j][hold]; // 注意这里是引用
            if (res != -1)  return res;// 之前计算过
            if (hold)   return res = max(dfs(dfs, i - 1, j, true), dfs(dfs, i - 1, j - 1, false) - prices[i]);
            return res = max(dfs(dfs, i - 1, j, false), dfs(dfs, i - 1, j, true) + prices[i]);
        };
        return dfs(dfs, n - 1, k, false);
    }
};

算法:1:1 翻译成递推

时间复杂度:O(nk),其中 n 为 prices 的长度。

空间复杂度:O(nk)

代码:

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

算法:空间优化

必须倒序遍历。

时间复杂度:O(nk),其中 n 为 prices 的长度。

空间复杂度:O(k)

代码:

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        vector<array<int, 2>> dp(k + 2, {INT_MIN / 2, INT_MIN / 2});
        for(int j = 1;j <= k + 1;j++)   dp[j][0] = 0;
        for(int p : prices)
            for(int j = k + 1;j > 0;j--){
                dp[j][0] = max(dp[j][0],dp[j][1] + p);
                dp[j][1] = max(dp[j][1],dp[j - 1][0] - p);
            }
            return dp[k + 1][0];
    }
};

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

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

相关文章

Dubbo--高性能RPC框架

文章目录 Dubbo介绍Dubbo基本架构Dubbo是什么&#xff0c;它能做什么 Dubbo入门示例1.准备工作2.创建Maven项目3.添加依赖3.1提供者服务3.2消费者服务 4.创建服务接口5.实现服务接口6.配置服务提供者7.配置服务消费者8.启动 ZooKeeper9.运行服务提供者10.运行服务消费者 Dubbo介…

信号发生器在扫描模式下输出正弦波信号,示波器呈现的波形显示异常与不理想,这是为什么

如下图所示&#xff0c;在信号发生器扫描模式下输出正弦波信号&#xff0c;示波器呈现出的波形显示“异常”“不理想”情况&#xff0c;其原因可能与以下因素有关&#xff1a; 1、扫描速度与示波器刷新率不匹配 如果信号发生器的扫描速率&#xff08;频率变化速度&#xff09;…

Leetcode题解精讲之二叉树的基本理论(分类、四种遍历方式、存储方式)

目录 0 专栏介绍1 二叉树的基本概念2 二叉树的分类3 二叉树的遍历3.1 前序遍历3.1.1 递归实现3.1.2 迭代实现 3.2 中序遍历3.2.1 递归实现3.2.2 迭代实现 3.3 后序遍历3.3.1 递归实现3.3.2 迭代实现 3.4 层序遍历3.4.1 递归实现3.4.2 迭代实现 4 二叉树存储模式5 其他技巧 0 专…

直觉微调——简化语言模型对齐过程

人工智能咨询培训老师叶梓 转载标明出处 预训练语言模型在遵循指令和信任度方面仍有待提高。为了解决这一问题&#xff0c;研究者们提出了监督式微调&#xff08;Supervised Fine-Tuning, SFT&#xff09;和偏好优化&#xff08;Preference Optimization, PO&#xff09;两种方…

算法提高模板强连通分量tarjan算法

AC代码&#xff1a; #include<bits/stdc.h>using namespace std;typedef long long ll; const int MOD 998244353; const int N 2e5 10;//强联通分量模板 //tarjan算法 vector<int>e[N]; int n, m, cnt; int dfn[N], low[N], ins[N], idx; int bel[N];//记录每…

STL容器真的好用吗

大家都在用的c STL就一定是完美无缺的吗&#xff1f; 本文一针见血的指出常见STL顺序容器vector的致命bug。 在Scott Meyers的《Effective C》中&#xff0c;第一个条款明确指出&#xff0c;C是一个语言联邦。 这体现在&#xff1a; ● C&#xff1a;C继承了C语言的基础特性&a…

零基础学习Python(八)—— time模块、request模块、数据分析和自动化办公相关模块、jieba模块、文件操作和os相关模块的简单介绍

1. time模块 time()&#xff1a;获取当前时间戳&#xff0c;是一个数字 localtime()&#xff1a;返回一个time.struct_time对象&#xff0c;里面有年月日时分秒&#xff0c;还有星期几&#xff08;0表示星期一&#xff09;和今年的第几天 import timeprint(time.time()) pri…

我又被Spring的事务坑了,用户兑奖之后,什么东西都没收到!!

没错&#xff0c;我又被事务坑了&#xff01; 即上次的mq发送消息之后&#xff0c;业务代码回滚&#xff0c;导致发了一条中奖消息给用户&#xff01;&#xff01;&#xff0c;这次又被spring的事务坑了 这次是这样的&#xff0c;一个兑奖接口进来&#xff0c;我们先改变了这…

输入一段文字,瞬间生成应用。Furion低代码平台与AI协同工作,展现出非凡的效率与精准。

引言&#xff1a;展示问题背景 在当今快速变化的商业环境中&#xff0c;企业面临着前所未有的挑战。随着数字化转型的加速&#xff0c;企业对应用开发的需求日益增加。然而&#xff0c;传统的应用开发流程通常需要耗费大量时间和资源&#xff0c;从需求分析、设计、编码、测试到…

概念科普|ChatGPT是什么

一、引言 在人工智能的迅猛发展中&#xff0c;ChatGPT作为前沿技术的代表&#xff0c;其原理和运作方式成为了研究和讨论的热点。 常有观点将ChatGPT比喻为一种高级词语接龙&#xff0c;通过海量数据的学习与训练&#xff0c;机器能够根据给定的文本内容续写出下文&#xff0…

小米商业营销陈高铭:品牌应该多方整合,关注高质量营销 | SMARTIES CHINA 2024终审报道②

小米互联网业务部商业营销品牌总经理 陈高铭 近日&#xff0c;SMARTIES CHINA 2024终审活动在苏州音昱水中天落下帷幕。来自各行业的40位品牌广告主代表&#xff0c;历时两天时间&#xff0c;通过紧张的评审和精彩的讨论&#xff0c;从178个优秀入围案例中评选出了每个类别的金…

数据分析-螺旋环状气泡图

1 原理 采用阿基米德螺线原理&#xff0c;即以一个点匀速离开一个固定点的同时又以固定的角速度绕该固定点转动而产生的轨迹。具体原理见&#xff1a;阿基米德螺线。坐标轴公式为&#xff1a; 其中x为横坐标&#xff0c;y为纵坐标&#xff0c;r为离中心点的半径&#xff0c;为坐…

茶叶商家开店拓客线上发展增长生意

部分地区的人群酷爱喝茶&#xff0c;其他地区也有大量购茶者&#xff0c;其爱好者对茶叶的种类、年份季节口感度、价格等有着较高要求&#xff0c;花茶、绿茶、红茶、白茶、龙井、碧螺春、乌龙茶等&#xff0c;国内国外庞大市场&#xff0c;不能仅局限于本地附近客户&#xff0…

【ArcGIS】栅格计算器原理及案例介绍

ArcGIS&#xff1a;栅格计算器原理及案例介绍 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍案例案例1&#xff1a;计算栅格数据平均值 参考 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍 描述&#xff1a;在类似计算器的界面中&#xff0c;…

跨境独立站支付收款常见问题排雷篇1.0丨出海笔记

最近小伙伴们在社群讨论挺多关于独立站支付问题的&#xff0c;鉴于不少朋友刚接触独立站&#xff0c;我整理了一些独立站支付相关的问题和解决方案&#xff0c;供大家参考&#xff0c;百度网上一堆媒体的那些软文大家就别看了&#xff0c;都是软广或者抄来抄去&#xff0c;让大…

华为 昇腾 310P 系列 AI 处理器支持 140Tops 的 AI 算力。

1、产品简介 模组是基于昇腾 310P 系列 AI 处理器设计而成&#xff0c;可实现图像、视频等多种数据分析 与推理计算。超强的视频编解码能力以及支持 140Tops 的 AI 算力。在边缘侧及端侧的嵌入式计算 领域&#xff0c;有着极高的性价比&#xff0c;具有超强算力、 超高能效、…

2024最新版mysql数据库表的查询操作-总结

序言 1、MySQL表操作(创建表&#xff0c;查询表结构&#xff0c;更改表字段等)&#xff0c; 2、MySQL的数据类型(CHAR、VARCHAR、BLOB,等)&#xff0c; 本节比较重要&#xff0c;对数据表数据进行查询操作&#xff0c;其中可能大家不熟悉的就对于INNER JOIN(内连接)、LEFT JOIN…

产业互联网新星闪耀,“太行云商”引领传统产业数字化革命

产业互联网新星升起 晋城&#xff0c;作为我国能源及相关产业的重要基地&#xff0c;一直面临着信息协同不畅、存货供需失衡、资金融通困难等诸多挑战。 2023年&#xff0c;为了应对这些难题&#xff0c;晋城市政府携手AMT企源&#xff0c;成立了太行云商科技有限公司&#x…

【生日视频制作】蓝色飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程蓝色飞机机身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】蓝色飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件…

串口调试助手+串口打印配置

目录 一、使用CUBE_MX配置串口 二、KEIL5配置 1.打开usart.c文件 2.打开main.c文件 在main函数中&#xff1a; 一、使用CUBE_MX配置串口 二、KEIL5配置 1.打开usart.c文件 UART_HandleTypeDef huart1;void MX_USART1_UART_Init(void) {/* USER CODE BEGIN USART1_Init 0 …