代码随想录 -- day51 --309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费

2023-09-17 12:39:02

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

注意 冷冻期只为1天

  • 状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
  • 不持有股票状态,这里就有两种卖出股票状态
    • 状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作)
    • 状态三:今天卖出股票
  • 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!

达到买入股票状态(状态一)即:dp[i][0],有两个具体操作:

  • 操作一:前一天就是持有股票状态(状态一),dp[i][0] = dp[i - 1][0]
  • 操作二:今天买入了,有两种情况
    • 前一天是冷冻期(状态四),dp[i - 1][3] - prices[i]
    • 前一天是保持卖出股票的状态(状态二),dp[i - 1][1] - prices[i]

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

达到保持卖出股票状态(状态二)即:dp[i][1],有两个具体操作:

  • 操作一:前一天就是状态二
  • 操作二:前一天是冷冻期(状态四)

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

达到今天就卖出股票状态(状态三),即:dp[i][2] ,只有一个操作:

昨天一定是持有股票状态(状态一),今天卖出

即:dp[i][2] = dp[i - 1][0] + prices[i];

达到冷冻期状态(状态四),即:dp[i][3],只有一个操作:

昨天卖出了股票(状态三)

dp[i][3] = dp[i - 1][2];

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 0) return 0;
        vector<vector<int>> dp(n, vector<int>(4, 0));
        dp[0][0] -= prices[0]; // 持股票
        for (int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
            dp[i][2] = dp[i - 1][0] + prices[i];
            dp[i][3] = dp[i - 1][2];
        }
        return max(dp[n - 1][3], max(dp[n - 1][1], dp[n - 1][2]));
    }
};

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

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] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);

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

  • 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
  • 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金,注意这里需要有手续费了即:dp[i - 1][0] + prices[i] - fee

所以:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int n = prices.size();
        vector<vector<int>> dp(n, vector<int>(2, 0));
        dp[0][0] -= prices[0]; // 持股票
        for (int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
        }
        return max(dp[n - 1][0], dp[n - 1][1]);
    }
};

更多推荐

Zabbix介绍与安装

目录一、概述二、zabbix的主要功能三、zabbix监控原理四、Zabbix监控模式五、zabbix的架构server-clientserver-proxy-clientmaster-node-client六、zabbix的安装安装zabbix服务端安装zabbix客户端测试zabbix1、在Web页面中添加agen

Windows脚本导入导出Mongodb数据库文件实现备份与恢复

导出指定时间范围的数据@echooffsetlocalrem提前将MongoDB安装的bin路径加到系统环境变量PATH里面,方便直接运行mongodump命令ifnotexistD:\MongoDB_backupgotocreategotostart:createrem如果没有创建导出文件目录,那么在此步骤创建mdD

链式法则:概率论描述语言模型

目录1.事件相互独立2.链式法则3.示例4.语言模型中的链式法则1.事件相互独立事件相互独立就是:一个事件的发生与否,不会影响另外一个事件的发生。当a和b两个事件互相独立时,有:P(a|b)=P(a)推广到3个事件就有下面这个公式:P(a|b,c)=P(a|c)其中:P(a|b,c)表示在b和c事件都发生的情况下,a事

特征融合篇 | YOLOv8 引入中心化特征金字塔 EVC 模块 | 《Centralized Feature Pyramid for Object Detection》

论文地址:https://arxiv.org/pdf/2210.02093.pdf代码地址:https://github.com/QY1994-0919/CFPNet视觉特征金字塔在广泛的应用中展示了其在效果和效率上的优越性。然而,现有的方法过于关注层间特征之间的交互,而忽视了层内特征的调节,而这些调节在经验上被证明是

springboot配置注入增强(二)属性注入的原理

一原理1配置的存储springboot在启动的时候会后构建一个org.springframework.core.env.Environment类型的对象,这个对象就是用于存储配置,如图springboot会在启动的最开始创建一个Environment对象这个webApplicationType的枚举是在newSprin

Java面向对象编程

对于IP地址130.63.160.2,MASK为255.255.255.0,子网号为()A.160.2B.160C.63.160D.130.63.160答案:B将网络物理地址转换为IP地址的协议是()A.IPB.ICMPC.ARPD.RARP答案:D有关cookie和session的描述,下面错误的是()A.cooki

如何在外网访问公司项目?快解析实现内网ip让公网连接

随着互联网技术的不断发展,越来越多的企业和个人选择使用服务器进行网站或应用程序的部署。公司内部项目需要提供外网访问是个常见的网络场景,需要怎么操作设置也是网络或项目人员需要关注的。企业使用服务器搭建公司业务系统一般会使用云服务器或者使用本地的服务器,有时候,我们需要让外部网络访问本地服务器。然而,由于大多数服务器都是在

Linux下的系统编程——守护进程、线程(十二)

前言:我们知道进程拥有一个PCB,在Linux中被称为task_struct,并且有一个进程地址空间,也有一个页表,通过页表指向物理内存,但是从今天开始,对进程的概念可能发生变化,这个我们后边来说,在Linux中,并没有真正的线程,而是使用进程的PCB来模拟线程,也就是说一个线程在创建时,只会去创建一个PCB,而这个P

【用unity实现100个游戏之13】复刻类泰瑞利亚生存建造游戏

文章目录前言素材人物瓦片一、建造系统1.定义物品类2.绘制地图3.实现瓦片选中效果4.限制瓦片选择5.放置物品功能6.清除物品7.生成和拾取物品功能二、库存系统源码完结前言本文来实现一个类泰瑞利亚游戏的demo,其中主要包括经典的库存系统和建造系统素材人物https://assetstore.unity.com/pac

使用自定义注解发布webservice服务

使用自定义注解发布webservice服务概要代码自定义注解WebService接口服务发布配置使用结果概要在springboot使用webservice,发布webservice服务的时候,我们经常需要手动在添加一些发布的代码,比如:@BeanpublicEndpointorganizationEndpoint(){

Redis 篇

1、为什么要用缓存?使用缓存的目的就是提升读写性能。而实际业务场景下,更多的是为了提升读性能,带来更好的性能,带来更高的并发量。Redis的读写性能比Mysql好的多,我们就可以把Mysql中的热点数据缓存到Redis中,提升读取性能,同时也减轻了Mysql的读取压力。2、什么是Redis?Redis是一个开源(BSD

热文推荐