每日OJ题_简单多问题dp⑥_力扣714. 买卖股票的最佳时机含手续费

目录

力扣714. 买卖股票的最佳时机含手续费

状态机分析

解析代码


力扣714. 买卖股票的最佳时机含手续费

714. 买卖股票的最佳时机含手续费

难度 中等

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例 1:

输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:8
解释:能够达到的最大利润:  
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8

示例 2:

输入:prices = [1,3,7,5,10,3], fee = 3
输出:6

提示:

  • 1 <= prices.length <= 5 * 10^4
  • 1 <= prices[i] < 5 * 10^4
  • 0 <= fee < 5 * 10^4
class Solution {
public:int maxProfit(vector<int>& prices, int fee) {}
};

状态机分析

以某个位置为结尾,结合题目要求,定义一个状态表示:

由于有买入卖出两个状态,因此可以选择用两个数组,其中:

  • f[i] 表示:第 i 天结束后,处于买入状态,此时的最大利润;
  • g[i] 表示:第 i 天结束后,处于卖出状态,此时的最大利润。

状态机:

状态转移方程:

选择在卖出的时候,支付这个手续费,那么在买⼊的时候,就不用再考虑手续费的问题。

对于 f[i] 买入状态,有两种情况能到达这个状态:

  • 在 i - 1 天持有股票(买入),第 i 天啥也不干。此时最大收益为 f[i - 1] ;
  • 在 i - 1 天的时候没有股票(卖出),在第 i 天买入股票。此时最大收益为 g[i - 1] - prices[i]) ; 

两种情况下应该取最大值,因此 f[i] = max(f[i - 1], g[i - 1] - prices[i]) 。


对于 g[i] 卖出状态,也有两种情况能够到达这个状态:

  • 在 i - 1 天持有股票(买入),在第 i 天将股票卖出,要支付手续费。此时最大收益为: f[i - 1] + prices[i] - fee) ;
  • 在 i - 1 天没有股票(卖出),然后第 i 天啥也不干。此时最大收益为: g[i - 1] ;

两种情况下应该取最大值,因此 g[i] = max(g[i - 1], f[i - 1] + prices[i] - fee) 。


初始化、填表顺序、返回值:

  • 对于 f[0] ,此时处于买入状态,因此 f[0] = -prices[0] ;
  • 对于 g[0] ,此时处于没有股票状态,啥也不干即可获得最大收益,因此 g[0] = 0 ;

填表顺序从左往右两个表一起填,最后返回g [n - 1];(肯定比f[n - 1]大,也可以比较后返回)。


解析代码

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();vector<int> f(n);vector<int> g(n);f[0] = -prices[0];for(int i = 1; i < n; ++i){f[i] = max(f[i - 1], g[i - 1] - prices[i]);g[i] = max(g[i - 1], f[i - 1] + prices[i] - fee);}return g[n - 1]; // 肯定比f[n - 1]大// return max(g[n - 1], f[n - 1]);}
};

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

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

相关文章

ffmpeg6.0从demux_decode.c源码探索解封装流程

前言 在播放器的播放视频、音视频媒体文件的推流等实际应用中,解封装(demux)这个操作是不可避免的,也是最基础的操作。 拿播放器播放MP4来说,如果想实现播放器视频画面的播放和音频声音的播放都需要经过这个解封装的步骤。因为MP4是一种媒体文件格式,是一种封装格式,M…

快速高效地数据分析处理:QtiPlot for Mac中文直装版 兼容M

QtiPlot 是一个用于数据分析和可视化的跨平台科学应用程序。由于其多语言支持&#xff0c;QtiPlot 被积极用于世界各地学术机构的教学。许多研究科学家信任 QtiPlot 来分析他们的数据并发布他们的工作结果。来自各个科学领域和行业的数千名注册用户已经选择了 QtiPlot 来帮助他…

Win32下char,,int ,float, double 各占多少位?Win64呢

Win32 (32位系统) char: 通常占用1个字节&#xff08;8位&#xff09;。在C和C中&#xff0c;char是一个字符类型&#xff0c;它可以是有符号的或无符号的&#xff0c;具体取决于编译器和设置。但无论其符号性如何&#xff0c;它通常都占用1个字节。int: 通常占用4个字节&…

一文全面了解向量数据库

1. 什么是向量数据库&#xff1f;** 首先&#xff0c;我们需要理解什么是向量&#xff1f; 向量是基于不同特征或属性来描述对象的数据表示。每个向量代表一个单独的数据点&#xff0c;例如一个词或一张图片&#xff0c;由描述其许多特性的值的集合组成。这些变量有时被称为“…

微信小程序上传图片c# asp.net mvc端接收案例

在微信小程序上传图片到服务器&#xff0c;并在ASP.NET MVC后端接收这个图片&#xff0c;可以通过以下步骤实现&#xff1a; 1. 微信小程序端 首先&#xff0c;在微信小程序前端&#xff0c;使用 wx.chooseImage API 选择图片&#xff0c;然后使用 wx.uploadFile API 将图片上…

C/C++火柴棍等式

有n根(n<24)火柴棍&#xff0c;你可以拼出多少个形如“ABC"的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零&#xff0c;则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示: 依次需要用到的火柴棍数目为6 2 5 5 4 5 6 3 7 6 。 如果是初学者可能会这么写。 …

数据结构:基于数组实现简单的数据缓存区(简单队列)

1 前言 在我们使用CAN或者以太网调试时&#xff0c;经常需要缓存最近n次收到的数据&#xff0c;以便于我们对数据进行分析。 实现这一想法我们很容易就会想到队列&#xff0c;队列就是一种先进先出的数据结构&#xff0c;之前在《数据结构&#xff1a;基于数组的环形队列&…

最新最全智能科学与技术专业毕业设计选题精华汇总-持续更新中

文章目录 0 简介1 如何选题2 最新智能科学与技术毕设选题3 最后 0 简介 Hi&#xff0c;大家好&#xff0c;随着毕业季的临近&#xff0c;许多同学开始向学长咨询关于选题和开题的问题。在这里&#xff0c;学长分享一些关于智能科学与技术专业毕业设计选题的内容。 以下为学长…

人大金仓大小写敏感处理

人大金仓安装的时候&#xff0c;不管是否选择大小写敏感&#xff1b;查询的时候加和不加双引号&#xff0c;查询出来的都是小写 针对人大金仓大小写&#xff0c;我们实际引用全是大写的情况&#xff0c;解决方案如下 添加配置&#xff0c;将查询结果全都转成大写 1、本地打开…

基于信号分解的几种一维时间序列降噪方法(MATLAB R2021B)

自适应信号分解算法是一种适合对非平稳信号分析的方法&#xff0c;它将一个信号分解为多个模态叠加的形式&#xff0c;进而可以准确反应信号中所包含的频率分量以及瞬时频率随时间变化的规律。自适应信号分解算法与众多“刚性”方法(如傅里叶变换&#xff0c;小波变换)不同&…

springBoot整合Redis(四、整合redis 实现分布式锁)

在单机环境&#xff0c;我们使用最多的是juc包里的单机锁&#xff0c;但是随着微服务分布式项目的普及&#xff0c;juc里的锁是不能控制分布锁环境的线程安全的&#xff0c;因为单机锁只能控制同个进程里的线程安全&#xff0c;不能控制多节点的线程安全&#xff0c;所以就需要…

AI系统性学习02-OpenAI官方提示工程

OpenAI官方提供了提示词工程指南。在这里将他们总结来指示LLM返回更好的结果。 策略1&#xff1a;撰写清晰的指令 如果输入的内容过于杂乱&#xff0c;模型无法读取你的思想。一般来说可以拥有以下的战术 在查询中包含技术细节以获得相关答案&#xff1b;要求模型扮演某种角…

SpringBoot3整合mybatis

SpringBoot3整合mybatis 一、添加mybatis的依赖二、通过XML配置三、通过yum或properties文件配置四、常用注解1.Mapper2.MapperScan 一、添加mybatis的依赖 <!--mybatis--> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>…

简单的网页制作

1网页编写格式 <!DOCTYPE html> <html><head><meta charset"utf-8"> <title>中文测试。。。。</title></head><body>这里是测试body测试内容。。。</body> </html>2标签 在body内<h1></h1&…

鸿蒙开发实现弹幕功能

鸿蒙开发实现弹幕功能如下&#xff1a; 弹幕轮播组件&#xff1a;BannerScroll import type { IDanMuInfoList, IDanMuInfoItem } from ../model/DanMuData //定义组件 Component export default struct BannerScroll {//Watch 用来监视状态数据的变化&#xff0c;包括&#…

Java代码基础算法练习-判断字符串是否为回文-2024.03.16

任务描述&#xff1a; 回文串是指一个正读和反读都一样的字符串&#xff0c;比如“level”或者“noon”等。要求输入 一个字符串&#xff0c;判断此字符串是否为回文。&#xff08;注&#xff1a;设字符串长度小于20&#xff09; 任务要求&#xff1a; package suanfa;import…

反弹shell的正向连接和反向连接

正向连接 解释 通常指受害主机&#xff08;被控制端&#xff09;监听一个端口&#xff0c;由控制主机&#xff08;攻击端&#xff09;主动去连接受害主机的过程。 通俗的讲&#xff0c;正向连接就是&#xff1a;攻击机主动连接被攻击机 命令 Linux服务器主动控制windows服务…

Vue:内置组件:KeepAlive(缓存组件实例)

一、作用 <KeepAlive></KeepAlive>能缓存包裹的所有组件&#xff0c;保证组件在切换时维持组件状态。 默认情况下&#xff0c;一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时&#xff0c;会创建一个只带有初…

部署一个本地的ChatGPT(Ollama)

一 下载Ollama Ollama下载地址&#xff1a;https://ollama.com/download 下载完后 二 安装运行 双击下载好的OllamaSetup.exe开发 安装Ollama: 安装完成后&#xff0c;多了一个Ollama的菜单如下图 &#xff1a; Ollama安装好默认是配置开机运行&#xff0c;如果没有运行可以在…

mysql语句中想要查询某一月每一天日期的平均值 ,SSM框架如何实现

mysql语句中想要查询某一月每一天日期的平均值 为了查询某一月份每一天的平均值&#xff0c;你可以使用以下SQL查询语句。这里假设你有一个表格data_table&#xff0c;它有一个日期时间列date_column和一个需要计算平均值的数值列value_column。 SELECTDATE_FORMAT(date_colum…