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

多状态Dp问题——买卖股票的最佳时机含冷冻期

目录

一,题目

二,题目接口

三,解题思路及其代码


一,题目

给定一个整数数组prices,其中第  prices[i] 表示第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

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

示例 1:

输入: prices = [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

示例 2:

输入: prices = [1]
输出: 0

二,题目接口

class Solution {
public:int maxProfit(vector<int>& prices) {}
};

三,解题思路及其代码

首先,要明确的一点便是这道题还是一个多状态的dp问题。在这样一道题里面,在每一天都会有三种状态:1.今天处于卖出状态。

                          2.今天处于买入状态。

                          3.今天处于冷冻期。

在明确好这些状态以后,便可以开始列举这几种状态间的转换关系了。

      转换到卖出状态的情况:1.前一天处于买入状态,今天卖出股票。3.前一天处于卖出状态,这一天什么也不做。

      转换到买入状态:1.前一天处于冷冻期状态,今天买入。2.前一天处于买入状态,今天啥也不做。

     转换到冷冻期:1.前一天处于卖出状态。

画出状态转移图如下:

在推理完这些状态转移关系以后便可以推导出要求最大值的情况下的状态转移方程,设:f(i),g(i),x(i)分别是卖出状态,买入状态,冷冻期的最大利润。那便可以推导出如下的状态转移方程:

 f[i] = max(x[i-1]-prices[i],f[i-1]);g[i] = max(f[i-1]+prices[i],g[i-1]);x[i] = g[i-1];

然后在完成初始化以后便可以写出这道题的动态规划解法了,代码如下:

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<int>f(n);auto g = f;auto x = f;f[0]= -prices[0];//初始化for(int i = 1;i<n;i++){f[i] = max(x[i-1]-prices[i],f[i-1]);g[i] = max(f[i-1]+prices[i],g[i-1]);x[i] = g[i-1];}return max(x[n-1],g[n-1]);}
};

过啦!!! 

 

相关文章:

  • 黑窗口连接远程服务
  • 苹果转移供应链,促中国手机和中国制造更紧密合作,加速技术升级
  • CCNA课程实验-13-PPPoE
  • node插件MongoDB(四)—— 库mongoose 的个性话读取(字段筛选、数据排序、数据截取)(四)
  • django|报错SQLite 3.8.3 or later is required的解决方案
  • 【数据结构】树与二叉树(十):二叉树的先序遍历(非递归算法NPO)
  • cefsharp 93.1.140 如何在js中暴露c#类
  • MySQL的索引和复合索引
  • SpringBoot中required a bean of type ‘java.lang.String‘ that could not be found问题
  • RabbitMQ集群配置以及负载均衡配置
  • 【Linux】tree命令的独特用法
  • Python实战:绘制直方图的示例代码,数据可视化获取样本分布特征
  • 数据分析实战 | 逻辑回归——病例自动诊断分析
  • 【GIT】Git中的Gui介绍,使用Git中的ssh协议介绍,使用使用idea集成Git
  • Java中的的default关键字 Java虚拟扩展方法(Java Virtual Extension Method,JVEM)
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【笔记】你不知道的JS读书笔记——Promise
  • Apache Pulsar 2.1 重磅发布
  • Brief introduction of how to 'Call, Apply and Bind'
  • HTML-表单
  • JavaScript DOM 10 - 滚动
  • Netty 4.1 源代码学习:线程模型
  • React组件设计模式(一)
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Terraform入门 - 3. 变更基础设施
  • vue 个人积累(使用工具,组件)
  • vue-router 实现分析
  • 设计模式走一遍---观察者模式
  • 思否第一天
  • 项目实战-Api的解决方案
  • 赢得Docker挑战最佳实践
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 从如何停掉 Promise 链说起
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 移动端高清、多屏适配方案
  • ​业务双活的数据切换思路设计(下)
  • #include
  • (42)STM32——LCD显示屏实验笔记
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读11/100)Fast R-CNN
  • (生成器)yield与(迭代器)generator
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net Core和.Net Standard直观理解
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .Net 应用中使用dot trace进行性能诊断
  • .net操作Excel出错解决
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .net中生成excel后调整宽度
  • .so文件(linux系统)
  • ??eclipse的安装配置问题!??
  • [20160807][系统设计的三次迭代]