数据结构预算法之买股票最好时机动态规划(可买卖多次)

news2024/10/3 0:24:44

一.题目

二.思路

在动规五部曲中,这个区别主要是体现在递推公式上,其他都和上一篇文章思路是一样的

所以我们重点讲一讲递推公式。

这里重申一下dp数组的含义:

  • dp[i][0] 表示第i天持有股票所得现金。

  • dp[i][1] 表示第i天不持有股票所得最多现金

如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来

  • 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]

  • 第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]

注意这里和上一题唯一不同的地方,就是推导dp[i][0]的时候,第i天买入股票的情况

在上一题中,因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是 -prices[i]。

而本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。

那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。

再来看看如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来

  • 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]

  • 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]

注意这里和上一题就是一样的逻辑,卖出股票收获利润(可能是负值)天经地义!

C++代码如下:

(注意代码中的注释,标记了和121.买卖股票的最佳时机唯一不同的地方)

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        vector<vector<int>> dp(len, vector<int>(2, 0));
        dp[0][0] -= prices[0];
        dp[0][1] = 0;
        for (int i = 1; i < len; i++) {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]); // 注意这里是和121. 买卖股票的最佳时机唯一不同的地方。
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }
        return dp[len - 1][1];
    }
};
  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

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

这正是因为本题的股票可以买卖多次! 所以买入股票的时候,可能会有之前买卖的利润即:dp[i - 1][1],所以dp[i - 1][1] - prices[i]。

想到到这一点,对这两道题理解的就比较深刻了。

Java语言版本:

// 动态规划
class Solution 
    // 实现1:二维数组存储
    // 可以将每天持有与否的情况分别用 dp[i][0] 和 dp[i][1] 来进行存储
    // 时间复杂度:O(n),空间复杂度:O(n)
    public int maxProfit(int[] prices) {
        int n = prices.length;
        int[][] dp = new int[n][2];     // 创建二维数组存储状态
        dp[0][0] = 0;                   // 初始状态
        dp[0][1] = -prices[0];
        for (int i = 1; i < n; ++i) {
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);    // 第 i 天,没有股票
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);    // 第 i 天,持有股票
        }
        return dp[n - 1][0];    // 卖出股票收益高于持有股票收益,因此取[0]
    }
}

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

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

相关文章

【Http1.0和Http1.1的区别?Http1.1和Http2.0的区别?】

计算机网络面试的相关知识你可不能不知道呀&#xff01;Http1.0和Http1.1的区别&#xff1f;Http1.1和Http2.0的区别&#xff1f; Http1.0和Http1.1的区别&#xff1f; 连接方式 : HTTP 1.0 为短连接&#xff0c;HTTP 1.1 支持长连接。状态响应码 : HTTP/1.1中新加入了大量的状…

小型水库大坝安全监测的主要对象

一、监测背景 大坝监测的目的分成两个大的方面&#xff0c;一方面是为了验证设计、指导施工、为科研提供必要的资料&#xff1b;另一方面&#xff0c;也可以说是更重要的方面&#xff0c;就是为了长期监视大坝的安全运行。因此&#xff0c;一个成功的监测设计者不仅要能充分领会…

Vmware 虚拟机无法联通主机

问题描述&#xff1a;今天使用Vmware Workstation 创建CentOS-7 虚拟机&#xff0c;基于CentOS-7 搭建Hadoop3 伪分布式版本&#xff0c;CentOS-7 测试Hadoop 3 服务正常启动&#xff0c;通过主机连接Hadoop 3的管理平台&#xff0c;提示如下错误信息&#xff1a;尝试解决办法&…

Android---Handler 源码解析

在 android 开发中&#xff0c;经常会在子线程中进行一些操作&#xff0c;当操作完后会通过 handler 发送一些数据给主线程&#xff0c;通知主线程做响应的操作。原理&#xff1a;子线程 handler 主线程&#xff0c;其实构成了线程模型中的经典问题&#xff0c;生产者-消费者模…

HHDESK文本对比功能

对比文件夹和图片而言&#xff0c;文本的更改更加频繁且琐碎&#xff1b;个别词语的更改更是让人“健忘”。 如果有一款工具能够直观的对文本进行对比&#xff0c;并且清晰的划分显示&#xff0c;那么便可以大量节约办公人员的精力和时间。 1 文本对比功能简介 版本更新&…

Ubuntu20.04配置深度学习环境

Ubuntu20.04配置深度学习环境 对于一台新Ubuntu20.04主机&#xff0c;想要直接进行深度学习模型的训练&#xff0c;需要进行一些常规配置。本文针对的情况包括物理机和虚拟机。安装部分本文不介绍&#xff0c;只介绍配置环境部分。 1. 安装中文输入法 参考如下博客&#xff…

Web安全最详细学习路线指南,从入门到入职(含书籍、工具包)

在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发 安全研究&#xff1a;二进制方向 安全研究&#xff1a;网络渗透方向 下面逐一说明一下. 第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#x…

《卓有成效的管理者》系列-总结篇

作者【美】彼得-德鲁克简介书中提到&#xff0c;每一位知识工作者其实都是管理者&#xff0c;而且卓有成效是每个管理者必须做到的事。书中认为所有负责行动和决策而且能够提高机构工作效率的人&#xff0c;都应该像管理者一样工作和思考。而且&#xff0c;一位卓有成效的管理者…

自考都有哪些科目?怎么搭配报考?

第一次自考科目搭配 先报理论课&#xff0c;熟悉学习和考试套路 参考搭配模式&#xff1a; 一、全报考公共课 公共课难度较低&#xff0c;通过率高&#xff0c;复习起来比较轻松。对于不确定考什么专业&#xff0c;后期想换专业的同学&#xff0c;考过公共课&#xff0c…

记一次Binder内存不足导致的应用被杀

每个进程的可用Binder内存大小是 1M-8KB 也就是900多KB 事情的起因的QA压测过程发生进程号变更&#xff0c;怀疑APP被杀掉过&#xff0c;于是开始看日志&#xff08;实际后来模拟的时候可以发现app确实被杀掉了&#xff09; APP的压测平台会上报进程号变更时间点&#xff0c;发…

基于C++环境的gRPC安装配置:vcpkg+CMake+VS2022

前言gRPC 是 Google 提供的一个 RPC 框架&#xff0c;用于在网络上实现多个应用程序之间的通信。gRPC的优点是支持多种语言&#xff0c;因此可以轻松使用C应用程序与Go或Python应用程序进行通信。尽管CSDN、知乎有很多讲解gRPC在C环境安装的文章&#xff0c;其中最常见的是使用…

LaneAF论文解读和代码讲解

论文地址&#xff1a;https://arxiv.org/abs/2103.12040 一、论文简介 LaneAF是一个语义分割聚类后处理的一种方法。相对于之前的用聚类算法对embedding分支聚类的方法&#xff0c;该论文提出了水平和垂直两个向量场&#xff0c;用来取缔之前的普通聚类。根据向量场就可以完成…

HashMap红黑树源码解读

链表转换为红黑树节点当往hashMap中添加元素&#xff0c;在同一个hash槽位挂载的元素超过8个后&#xff0c;执行treeifyBin方法。在treeifyBin方法中&#xff0c;只有当tab数组&#xff08;hash槽位&#xff09;的长度不小于MIN_TREEIFY_CAPACITY&#xff08;默认64&#xff09…

modbus协议

1 MODBUS 应用层报文传输协议 ADU应用数据单元PDU协议数据单元MBMODBUS协议MBAPMODBUS协议 ADU&#xff1a;地址域 PDU 差错校验PDU&#xff1a;功能码数据 串行链路&#xff1a; 最大RS485 ADU 256 字节PDU 256 - 服务器地址&#xff08;1字节&#xff09;- CRC&#xf…

Linux学习(7)文件权限与目录配置

目录 1. 使用者与群组 1&#xff0c;文件拥有者 2&#xff0c;群组概念 3&#xff0c;其他人 Linux 用户身份与群组记录的文件 2.Linux 文件权限概念 Linux的文件属性 第一栏代表这个文件的类型与权限(permission)&#xff1a; 第二栏表示有多少档名连结到此节点(i-no…

linux CUDAtoolkit+cudnn+tensorrt 的安装

windows上 CUDAtoolkitcudnn的安装 CUDAtoolkitcudnn的安装 须知 use command ubuntu-drivers devices查看你的显卡类型和推荐的驱动版本百度 nvidia-driver-*** 支持的 cuda 或 去文档查找驱动(比如450&#xff0c;460)匹配的cuda版本 下载 网盘下载 https://www.aliyundr…

Python实现贝叶斯优化器(Bayes_opt)优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器 (BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是…

18523-47-2,3-Azidopropionic Acid,叠氮基丙酸,可以与炔烃发生点击化学反应

【中文名称】3-叠氮基丙酸【英文名称】 3-Azidopropionic Acid&#xff0c;3-Azidopropionic COOH【结 构 式】【CAS】18523-47-2【分子式】C3H5N3O2【分子量】115.09【纯度标准】95%【包装规格】1g&#xff0c;5g&#xff0c;10g【是否接受定制】可进行定制&#xff0c;定制时…

龙蜥开发者说:为爱发电!当一个龙蜥社区打包 Contributor 是怎样的体验?| 第16期

「龙蜥开发者说」第 16 期来了&#xff01;开发者与开源社区相辅相成&#xff0c;相互成就&#xff0c;这些个人在龙蜥社区的使用心得、实践总结和技术成长经历都是宝贵的&#xff0c;我们希望在这里让更多人看见技术的力量。本期故事&#xff0c;我们邀请了龙蜥社区开发者 Fun…

无线通信时代的新技术----信标( Beacon)

随着IT技术的发展&#xff0c;无线通信技术也在不断发展。 现已根据预期用途开发了各种无线通信技术&#xff0c;例如 NFC、WIFI、Bluetooth和 RFID。 车辆内部结构的复杂化和数字化&#xff0c;车载通信网络技术的重要性也越来越高。 一个典型的例子是远程信息处理。 远程信息…