当前位置: 首页 > news >正文

简单多状态dp第三弹 leetcode -买卖股票的最佳时机问题


 

309. 买卖股票的最佳时机含冷冻期

买卖股票的最佳时机含冷冻期

分析:

使用动态规划解决

状态表示:

由于有「买入」「可交易」「冷冻期」三个状态,因此我们可以选择用三个数组,其中:
dp[i][0] 表示:第 i 天结束后,处于「买入」状态,此时的最大利润。
dp[i][1] 表示:第 i 天结束后,处于「可交易」状态,此时的最大利润。
dp[i][2] 表示:第 i 天结束后,处于「冷冻期」状态,此时的最大利润。

状态转移方程:

1.处于买入状态的时候,我们现在有股票,此时不能买股票,只能继续持有股票,或者卖
出股票;

2.处于卖出状态的时候:

如果在冷冻期,不能买入。

如果 不在冷冻期,才能买入。

画出状态图

根据状态图可以得出:

买入->买入:什么都不干

买入->卖出:买入股票

对应代码:a[i]=max(a[i-1],c[i-1]-prices[i-1]);

卖出->卖出:什么都不干

卖出->冷冻期:卖出股票

对应代码:b[i]=max(b[i-1],a[i-1]+prices[i-1]);

冷冻期->冷冻期:什么都不干

冷冻期->买入:冷冻期结束

对应代码:c[i]=max(c[i-1],b[i-1]);

代码:

class Solution {
public:int maxProfit(vector<int>& prices) {int n=prices.size();vector<int>a(n+1);//买入vector<int>b(n+1);//卖出vector<int>c(n+1);//冷冻a[0]-=prices[0];for(int i=1;i<=n;i++){a[i]=max(a[i-1],c[i-1]-prices[i-1]);b[i]=max(b[i-1],a[i-1]+prices[i-1]);c[i]=max(c[i-1],b[i-1]);}return max(b[n],c[n]);//从卖出和冷冻期中选出最大值,因为买入状态肯定不是最大值,因为还有股票没有卖出。}
};


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

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

分析:

使用动态规划解决

 

与 买卖股票的最佳时机含冷冻期 问题相似,我们直接画出状态图写状态方程。

状态图:

 

买入->买入:什么都不干

买入->卖出:买入股票

对应代码:a[i]=max(a[i-1],c[i-1]-prices[i-1]);

卖出->卖出:什么都不干

卖出->买入:卖出股票并支付手续费

对应代码:b[i]=max(b[i-1],a[i-1]+prices[i-1]-fee);

代码:

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {int n=prices.size();vector<int>a(n+1);//买入vector<int>b(n+1);//卖出a[0]-=prices[0];for(int i=1;i<=n;i++){a[i]=max(a[i-1],b[i-1]-prices[i-1]);b[i]=max(b[i-1],a[i-1]+prices[i-1]-fee);}return b[n];}
};


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

买卖股票的最佳时机 III

状态表示:

这里我们选择比较常用的方式,以某个位置为结尾,结合题目要求,定义一个状态表示:
由于有「买入」「可交易」两个状态,因此我们可以选择用两个数组。但是这道题里面还有交易次
数的限制,因此我们还需要再加上一维,用来表示交易次数。其中:

▪ f[i][j] 表示:第 i 天结束后,完成了 j 次交易,处于「买入」状态,此时的最大利
润;
▪ g[i][j] 表示:第 i 天结束后,完成了 j 次交易,处于「卖出」状态,此时的最大利
润。

状态转移方程:
 

A.对于 f[i][j] ,我们有两种情况到这个状态:


1. 在 i - 1 天的时候,交易了 j 次,处于「买入」状态,第 i 天啥也不干即可。此时最
大利润为: f[i - 1][j] ;


2. 在 i - 1 天的时候,交易了 j 次,处于「卖出」状态,第 i 天的时候把股票买了。此
时的最大利润为: g[i - 1][j] - prices[i] 。


综上,我们要的是「最大利润」,因此是两者的最大值: f[i][j] = max(f[i - 1][j],
g[i - 1][j] - prices[i]) 。

B.对于 g[i][j] ,我们也有两种情况可以到达这个状态:


1.在 i - 1 天的时候,交易了 j 次,处于「卖出」状态,第 i 天啥也不干即可。此时的
最大利润为: g[i - 1][j] ;


2.在 i - 1 天的时候,交易了 j - 1 次,处于「买入」状态,第 i 天把股票卖了,然
后就完成了 j 比交易。此时的最大利润为: f[i - 1][j - 1] + prices[i] 。但
是这个状态不一定存在,要先判断一下。

综上,我们要的是最大利润,因此状态转移方程为:
g[i][j] = g[i - 1][j];
if(j >= 1) g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);

代码:

class Solution {
public:int maxProfit(vector<int>& prices) {const int INF=0x3f3f3f3f;int n=prices.size();vector<vector<int>>f(n+1,vector<int>(3,-INF));//买vector<vector<int>>g(n+1,vector<int>(3,-INF));//卖f[0][0]=-prices[0];g[0][0]=0;for(int i=1;i<n;i++){for(int j=0;j<3;j++){f[i][j]=max(f[i-1][j],g[i-1][j]-prices[i]);g[i][j]=g[i-1][j];if(j-1>=0){g[i][j]=max(g[i][j],f[i-1][j-1]+prices[i]);}}}int ans=0;for(int i=0;i<3;i++){ans=max(ans,g[n-1][i]);}return ans;}
};

 

http://www.lryc.cn/news/445302.html

相关文章:

  • 游戏化在电子课程中的作用:提高参与度和学习成果
  • php+mysql安装
  • 音视频入门基础:FLV专题(5)——FFmpeg源码中,判断某文件是否为FLV文件的实现
  • Tomcat 乱码问题彻底解决
  • RGB颜色模型
  • 智能工厂的软件设计 创新型原始制造商(“创新工厂“)的Creator原型(统一行为理论)之2
  • 【个人博客hexo版】hexo安装时会出现的一些问题
  • 道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路
  • java接口文档配置
  • 【服务器第二期】mobaxterm软件下载及连接
  • 排序-----计数排序(非比较排序)
  • [Python]案例驱动最佳入门:Python数据可视化在气候研究中的应用
  • PyQt5 导入ui文件报错 AttributeError: type object ‘Qt‘ has no attribute
  • Unity中Rigidbody 刚体组件和Rigidbody类是什么?
  • MySQL学习笔记(持续更新中)
  • sqlserver插入数据删除数据
  • [51单片机] 简单介绍 (一)
  • 6个岗位抢1个人,百万年薪抢毕业生?大厂打响AI人才战
  • erlang学习:Linux命令学习3
  • 力扣41 缺失的第一个正数 Java版本
  • 第五篇:Linux进程的相关知识总结(1)
  • 企业级Windows server服务器技术(1)
  • 【30天玩转python】单元测试与调试
  • 13.第二阶段x86游戏实战2-动态模块地址
  • 【WebLogic】WebLogic 11g 控制台模式下安装记录
  • 失踪人口回归(明天开始继续更新学习内容)
  • AIGC对网络安全的影响
  • golang学习笔记25——golang 实现 MD5加密、RSA加密 和 Base64编码
  • 2024海外电商数据分析之印度篇
  • JavaWeb纯小白笔记02:Tomcat的使用:发布项目的三种方式、配置虚拟主机、配置用户名和密码