动态规划(DP)---- 买卖股票的最大利润(1)

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖 一次 该股票可能获得的利润是多少?

例如一只股票在某些时间节点的价格为 [9,11,8,5,7,12,16,14]。

如果我们能在价格为 5 的时候买入并在价格为 16 时卖出,则能收获最大的利润 11。

数据范围

输入数组长度 [0,500]。

样例
输入:[9, 11, 8, 5, 7, 12, 16, 14]输出:11

这道题咱们根据题意,题干说明在某一天买入并在某一天卖出,那肯定是买入的天数小于等于卖出 的天数,所以咱们这道题可以用三种方法,一种利用两层循环分别枚举买入与卖出的第几天比较最大值,一种是利用贪心找到买入的最小值来使利润最大,还有一种就是这道题是最值问题,肯定少不了动态规划,所以下面以这两种方法进行解析。


 暴力法:

咱们先利用两层for循环分别枚举天数,因为卖出的天数肯定会大于买入的天数,所以咱们将卖出放在外层循环,内层循环为买入的天数。

class Solution {
public:int maxDiff(vector<int>& nums) {if(nums.empty())  return 0; //判断该vector是否为空int maxv = 0,imax = 0;for(int i = 1;i <= nums.size() - 1;i++){for(int j = 0;j < i;j++){maxv = max(maxv,nums[i] - nums[j]); //选出在第i天卖出的最大值}imax = max(maxv,imax); //通过比较前i天的利润,选出最大值}return imax;  //并返回最大利润}
};

 贪心法:

先枚举卖出的天数,用res比较出第i天卖出时的最大利润,并用贪心贪到前面买入的最小花费,以便于第i + 1天找到最大利润

class Solution {
public:int maxDiff(vector<int>& nums) {if(nums.empty())  return 0;int res = 0;for(int i = 1,minv = nums[0];i <= nums.size() - 1;i++){res = max(res , nums[i] - minv);//第i天卖出的最大利润minv = min(minv , nums[i]); //minv存入的是前i天的最小买入的金钱}return res;  //返回最大利润}
};

 动态规划:

分析动态规划的时候先研究其dp数组的含义以及其数组内每一维数的含义

如果咱们要是直接将dp[i]数组含义表示为前i天的最大利润,那么我们发现进行状态表示的时候很难判断当天的买入与卖出与不进行操作的状态,所以这里设置二维数组,dp[i][0]表示前i天买入的最大价值,dp[i][1]表是前i天卖出的最大价值。

设置完dp数组的含义,我们将其集合表示,分析其状态转移

①对于dp[i][0]集合,我们可以将其用买入与不买入的两个集合表示:

买入的集合表示成-nums[i],因为买入我们是要花费钱,所以这里就要表示成负数;不买入的集合表示成dp[i - 1][0]。

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

②而对于dp[i][1]集合,我们可以也是同样的道理,表示成卖出与不卖出这两个集合:

卖出的集合表示为dp[i - 1][0] + nums[i],不卖出的集合为dp[i - 1][1]。

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

(这里的集合表示是通过dp数组的含义推出)

注意,这里咱们分析完状态转移之后,要分析其初始化问题,这里因为咱们的动态规划递推过程的开始是以dp[0][0]进行,所以这个dp[0][0]不能赋值为0,要根据其含义赋值,dp[0][0]代表的含义为买入第0个物品的最大价值,所以这里的dp[0][0] = -nums[0]。

下面看一下完整代码:

class Solution {
public:int maxDiff(vector<int>& nums) {if(nums.empty())  return 0;int dp[1000][3];dp[0][0] = -nums[0];for(int i = 1;i <= nums.size() - 1;i++){dp[i][0] = max(dp[i - 1][0] , -nums[i]);dp[i][1] = max(dp[i - 1][1] , dp[i - 1][0] + nums[i]);}return dp[nums.size() - 1][1];}
};

好了,本期内容就到这里了,下期继续讲解动态规划相关知识。

感谢收看,记得三连支持。

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

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

相关文章

【Vue】1-2、Webpack 中的插件

一、Webpack 插件的作用 通过安装和配置第三方的插件&#xff0c;可以拓展 webpack 的能力&#xff0c;从而让 webpack 用起来更方便。 二、两个常用插件 1&#xff09;webpack-dev-server 类似于 node.js 使用的 nodemon 工具 每当修改了源代码&#xff0c;webpack 会自动…

C++ 类的初始化列表

C 中的类必须使用初始化列表的 4 种情况&#xff1a; 一&#xff0c;继承于一个基类&#xff0c;这个基类的构造函数有参数时。 #include <stdio.h> #include <stdlib.h>#pragma pack(4) class CBase { public:CBase(int value): bBaseValue(value){}~CBase(){}p…

处理 Maven jar 包下载失败问题

目录 1、配置国内 Maven 源 配置和检测 settings.xml 配置国内源 2、删除本地 maven 创库的 jar 重新下载 3、其他问题 一般情况下 maven jar 包下载不成功可能有两种情况&#xff1a; 1&#xff09;没有配置国内源 2&#xff09;jar 包需要重新下载 下面详细讲解如何解决这两…

【jetson笔记】解决vscode远程调试qt.qpa.xcb: could not connect to display报错

配置x11转发 jetson远程安装x11转发 安装Xming Xming下载 安装完成后打开安装目录C:\Program Files (x86)\Xming 用记事本打开X0.hosts文件&#xff0c;添加jetson IP地址 后续IP改变需要重新修改配置文件 localhost 192.168.107.57打开Xlaunch Win菜单搜索Xlaundch打开 一…

x-cmd pkg | go - Google 开发的开源编程语言

目录 简介首次用户技术特点竞品分析编译型语言解释型语言JavaWebAssebmly 进一步阅读 简介 Go 语言&#xff08;或 Golang&#xff09;是 Google 开发的开源编程语言&#xff0c;诞生于 2006 年。其设计目标是“兼具 Python 等动态语言的开发速度和 C/C 等编译型语言的性能与安…

机器学习---无偏估计

1. 如何理解无偏估计 无偏估计&#xff1a;就是我认为所有样本出现的概率⼀样。 假如有N种样本我们认为所有样本出现概率都是 1/N。然后根据这个来计算数学期望。此时的数学期望就是我们平常讲 的平均值。数学期望本质就 是平均值。 2. 无偏估计为何叫做“无偏”&#xff1…

20240128-读书带来的影响

我本身不算是一个特别喜欢读书的人&#xff0c;更多的时候其实是为了读书而读书。在坚持每天读了一小时书之后&#xff0c;我发现自身开始慢慢有些变化。是什么时候突然有了这种感悟呢&#xff0c;是最近每周5小时左右的微信读书以及纸质书籍的阅读&#xff0c;让我体会到了读书…

常见の算法5

位图 一个int类型32字节&#xff0c;可以表示0-31这32个数出没出现过&#xff0c;出现过1没出现0&#xff0c;再扩大一点搞个数组&#xff0c;就可以表示0-1023出没出现过&#xff0c;一个long类型可储存64位 如何把10位组成的数&#xff0c;第四位由1改成零 package class05…

嵌入式linux面试题目总结

Linux系统中常见的面试题目&#xff0c;分享&#xff0c;欢迎大家前来交流学习。 1、嵌入式系统中的CAN通信协议是什么&#xff1f; CAN&#xff08;Controller Area Network&#xff09;通信协议是一种广泛应用于嵌入式系统中的串行通信协议。它最初由德国汽车工业联合会开发…

mysql升级5.X到mysql8关键字问题

数据库系统升级&#xff0c;要注意很多东西&#xff0c;5.x版本升级到mysql8&#xff0c;是一次大的版本升级&#xff0c;因此要注意诸多事项. charset更新 关键字 一些在5.x版本没有问题的字段&#xff0c;在mysql8中会触发关键字. 例如&#xff1a; rank&#xff0c;在mys…

VS如何打包环境

以VS2005为例子,做好的软件需要发给客户现场升级,有时候总是因为系统,环境变量不同导致软件不能正常运行打开,这也是程序员非常头疼的问题,今天我们就一起看下打包环境变量. 这样我们的环境变量就打包到setup中了,目标机台安装即可!!!

新概念英语第二册(43)上

【New words and expressions】生词和短语&#xff08;13&#xff09; pole n.&#xff08;地球的&#xff09;极 flight n. 飞行 explorer n. 探险家 lie …

[Python] numpy - 如何对数组进行降维或者升维

什么是数组升维&#xff1f; 数组升维是指将原本低维数组转换为更高维的数组的操作。在编程中&#xff0c;数组是一种存储多个相同类型数据的连续内存空间。升维操作可以通过添加额外的维度来增加数组的维数。 举个例子&#xff0c;将一个一维数组升维为二维数组可以使用resh…

Java集合-Map接口(key-value)

Map接口的特点&#xff1a;①KV键值对方式存储②Key键唯一&#xff0c;Value允许重复③无序。 Map有四个实现类&#xff1a;1.HashMap类2.LinkedHashMap类3.TreeMap类4.Hashtable类 1.HashMap类&#xff1a; 存储结构&#xff1a;哈希表 数组Node[ ] 链表&#xff08;红黑…

在windows环境下安装hadoop

Hadoop是一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。但这个架构是基于java语言开发的&#xff0c;所以要先进行jdk的安装&#xff0c;如果电脑已经配置过jdk或者是曾经运行成功过java文件&#xff0c;那就可以跳过第一步。 …

想用verilog写一个npu 需要什么学习路线?

要用Verilog编写一个NPU&#xff08;神经处理单元&#xff09;&#xff0c;你需要经过以下学习路线&#xff1a; 数字电路基础&#xff1a; 学习数字电路的基本概念&#xff0c;包括逻辑门、寄存器、时钟信号、信号传输等。 Verilog编程语言&#xff1a; 学习Verilog HDL&…

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一&#xff1a;Jenkins上调整 进入配置&#xff1a; 构建环境&#xff1a; 自行选择超时时间即可&#xff5e; 2、方案二&#xff1a;代码调整【python】 安装插件&#xff1a;pytest-timeout 选择一&#xff1a;装饰器用法&#xff1a;将单个测试用例标记为超时&…

【随谈】为什么高端开发岗要求研究过源码?如何研究?

今天来聊一个简单的问题&#xff1a;研究源码有什么用&#xff1f; 不知道你是否注意过&#xff0c;如果找薪资3万以上的岗位&#xff0c;往往都要求研究过框架和中间件源码的优先考虑。 我们随便选几个例子&#xff1a; 这里条件虽然写了很多&#xff0c;但是最重要的都是要…

编程笔记 html5cssjs 063 JavaScrip输出

编程笔记 html5&css&js 063 JavaScrip输出 一、JavaScript 输出方式二、弹出警告框来显示数据三、操作 HTML 元素四、写到 HTML 文档五 、写到控制台小结 JavaScript 输出。JavaScript 没有任何打印或者输出的函数。JavaScript输出主要是显示数据&#xff0c;以使我们看…

Hadoop集群部署流程

前置要求 需要3台虚拟机&#xff0c;系统为Centos7&#xff0c;分别host命名为node1&#xff0c;node2&#xff0c;node3&#xff0c;密码均为root请确保这三台虚拟机已经完成了JDK、SSH免密、关闭防火墙、配置主机名映射等前置操作 在3台虚拟机的/etc/hosts文件中&#xff0…