【动态规划】309. 买卖股票的最佳时机含冷冻期、 714. 买卖股票的最佳时机含手续费

news2025/1/19 8:01:20

提示:努力生活,开心、快乐的一天

文章目录

  • 309. 买卖股票的最佳时机含冷冻期
    • 💡解题思路
    • 🤔遇到的问题
    • 💻代码实现
    • 🎯题目总结
  • 714. 买卖股票的最佳时机含手续费
    • 💡解题思路
    • 🤔遇到的问题
    • 💻代码实现
    • 🎯题目总结
  • 🎈今日心得


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

题目链接:309. 买卖股票的最佳时机含冷冻期

💡解题思路

动规五部曲:

  • 确定dp数组以及下标的含义:**dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。**主要分为四种状态:
    0:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
    1:不持有股票状态1:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作)
    2:不持有股票状态2:今天卖出股票
    3:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!
  • 确定递推公式:
    达到买入股票状态(状态一)即:dp[i][0],有两个具体操作
    1、 操作一:前一天就是持有股票状态(状态一),dp[i][0] = dp[i - 1][0]
    2、 操作二:今天买入了,有两种情况:
    前一天是冷冻期(状态四),dp[i - 1][3] - prices[i];
    前一天是保持卖出股票的状态(状态二),dp[i - 1][1] - prices[i]
    dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i])
    达到保持卖出股票状态(状态二)即:dp[i][1],有两个具体操作:
    1、操作一:前一天就是状态二
    2、操作二:前一天是冷冻期(状态四)
    dp[i][1] = Math.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];
  • dp数组如何初始化:
    第0天状态一,dp[0][0] = -prices[0],一定是当天买入股票
    第0天状态二 ,dp[0][1] = 0;
    第0天状态三,dp[0][2] = 0;
    第0天状态四,dp[0][3] = 0;
  • 确定遍历顺序:从递推公式可以看出dp[i]都是由dp[i - 1]推导出来的,那么一定是从前向后遍历。
  • 举例推导dp数组:按照递推公式推导一下做推导,如果发现结果不对,就把dp数组打印出来在这里插入图片描述
    最后结果是取 状态二,状态三,和状态四的最大值,状态四是冷冻期,最后一天如果是冷冻期也可能是最大值。

🤔遇到的问题

  1. dp数组初始化的时候,出错了 ,应该初始化为四维数组

💻代码实现

动态规划

var maxProfit = function(prices) {
  // 0:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
  // 1:不持有股票状态1:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作)
  // 2:不持有股票状态2:今天卖出股票
  // 3:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!
let len = prices.length;
if(len < 2) return 0;
else if(len<3) return Math.max(0,prices[1]-prices[0])
let dp = Array.from(Array(len), () => Array(4).fill(0));
dp[0][0] = -prices[0]
for(let i=1; i<len; i++){
  dp[i][0] = Math.max(dp[i-1][0],dp[i-1][3]-prices[i],dp[i-1][1]-prices[i])
  dp[i][1] = Math.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 Math.max(dp[len-1][1],dp[len-1][2],dp[len-1][3])
};

🎯题目总结

  1. 四个状态梳理清楚了就比较简单了
    0:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
    1:不持有股票状态1:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作)
    2:不持有股票状态2:今天卖出股票
    3:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!

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

题目链接:714. 买卖股票的最佳时机含手续费

💡解题思路

  1. 相对于动态规划:122.买卖股票的最佳时机II (opens new window),本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。
    唯一差别在于递推公式部分,所以主要讲解一下递推公式部分。
  2. dp[i][0] 表示第i天持有股票所得 最多现金。 dp[i][1] 表示第i天不持有股票所得最多现金
    如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来
    1、 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
    2、今第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]
    dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i])
    如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来
    1、第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
    2、第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金,注意这里需要有手续费了即:dp[i - 1][0] + prices[i] - fee
    dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee)

🤔遇到的问题

  1. 只有两个状态,滤清两个状态即可

💻代码实现

暴力解法

var maxProfit = function(prices, fee) {
  //dp[i][0] 表示第i天持有股票所得最多现金
  // dp[i][1] 表示第i天不持有股票所得最多现金
  let len = prices.length;
  let dp = new Array(len).fill([0,0])
  dp[0][0] = -prices[0]
  for(let i =1;i<len;i++) {
    dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]-prices[i])
    dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]-fee)
  }
  return Math.max(dp[len-1][0],dp[len-1][1])
};

🎯题目总结

只有卖出股票才会有手续费

🎈今日心得

在这里插入图片描述

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

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

相关文章

MybatisPlus 从零开始 全面学习!

引入 本文以下将mybatisPlus简称为mp 首先注意: mybatisPlus不是mybatis 的替代品,而是增强mybatis的技术. 只做增强不做改变, 引入他不会对现有工程产生影响. 快速入门 基本步骤 以下为mapper例子: 要继承这个BaseMapper类, 并在泛型括号中 标注好要操作的类 public interf…

【题解】[NOIP2015]扫雷游戏(Java C++)

题目描述 见 P2670 [NOIP2015 普及组] 扫雷游戏 - 洛谷。 前置知识 无。 题目分析 只需要统计每一个格子周围 8 个格子的地雷数量即可。 重点是处理边界情况&#xff0c;比如左上角&#xff0c;有五个格子不在数组范围内&#xff0c;需要特殊处理。 为了避免思路混乱&a…

div盒子放在页面正中间,添加旋转动画的时候,盒子向右下偏移

一、问题代码&#xff08;核心部分&#xff09; //盒子定位在页面正中心 #spinner { position: absolute; left: 50%; top: 50%; border: #2ecc71 solid 1px; transform: translate(-50%, -50%); animation: rotate 5s linear 2s forwards; transform-origin: 50% 50%; } keyfr…

hadoop组成

在hadoop1.x时代,Hadoop中的MapReduce同时处理业务逻辑运算和资源调度,耦合性较大; 在hadoop2.x时代,新增了yarn,主要负责资源的调度,MapReduce仅负责运算; 在hadoop3.x时代,在组成上没有变化;

【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;vue要做权限管理该怎么做…

社区活动|Apollo开发者城市活动·长沙站来啦!

Apollo开发者城市活动长沙站 2023/10/22 &#x1f64b;想亲身乘坐无人车&#xff0c;感受自动驾驶技术的魅力吗&#xff1f; &#x1f64b;想与技术大咖面对面&#xff0c;了解自动驾驶的历史与原理吗&#xff1f; &#x1f64b;想与本地开发者交流心得&#xff0c;实现自动…

springboot自动配置原理面试题(自用)

springboot自动装配主要是基于注解编程和约定大于配置的思想设计 核心步骤&#xff1a; 1 组件必须包含configuration并声明为bean注解返回注入到IOC容器中 2 第三方jar包&#xff0c;根据/meta-inf/目录下增加spring.factories文件加载配置文件中的内容 3 springboot获取到…

游戏开发这么久没见过github-lfs-居然不能下载图片的,这就让你见到了解决方法

以前很少见到github上有游戏的整体仓库&#xff0c;还觉得是游戏人都不爱分享 git 是很好的分布式代码管理&#xff0c;但对于大部分的“”云资源“”管理&#xff0c;git的很多原生功能并不擅长 现在想想&#xff0c;其实也合理&#xff0c;基本只要是手游换皮游戏&#xff…

注释的两难之道:程序员的反思

文章目录 代码即注释&#xff1f;注释的艺术1. 注释要言简意赅2. 注释的时机3. 注释内容4. 避免无意义的注释5. 维护注释 如何看待注释&#xff1f; &#x1f389;欢迎来到Java学习路线专栏~注释的两难之道&#xff1a;程序员的反思 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f3…

JDBC批量插入数据

PreparedStatement的一些好处 1.PreparedStatement可以防止SQL注入 2.PreparedStatement可以操作Blob数据,Statement做不到. 3.PreparedStatement可以实现更高效的批量操作 演示PreparedStatement批量操作 在数据库操作中 update,delete后面如果没有条件,本身就可以就可以…

基于html5开发的Win12网页版,抢先体验

据 MSPoweruser 报道&#xff0c;Windows 11虽然刚刚开始步入正轨&#xff0c;但最新爆料称微软已经在开启下一个计划&#xff0c;Windows 12 的开发将在 去年3 月份开始。德国科技网站 Deskmodder.de 称&#xff0c;根据内部消息&#xff0c;微软将在 2022年3 月开始开发 Wind…

02_单片机及开发板介绍

单片机简介 单片机&#xff0c;又称为微控制器&#xff08;Microcontroller&#xff09;&#xff0c;是一种集成了微处理器核心、存储器、输入/输出接口及各种功能模块的集成电路芯片。它通常由中央处理器&#xff08;CPU&#xff09;、存储器、输入/输出接口以及各种外设组成&…

HDLbits: Fsm serial

根据题意设计了四个状态&#xff0c;写出代码如下&#xff1a; module top_module(input clk,input in,input reset, // Synchronous resetoutput done ); parameter IDLE 3b000, START 3b001, DATA 3b010, STOP 3b100, bit_counter_end 4d7;reg [2:0] state,next_sta…

关于TCP协议面试中常见的一千个问题

TCP传输层控制协议 TCP是面向连接的、可靠的、基于字节流的传输层通信协议。 TCP 头部格式 1、 源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。 2、 序号字段——占 4 字节。TCP 连接中传送的数据流中…

诊断DLL——Vector模板生成Send2Key.dll

文章目录 前言一、Vector诊断控制台Secutity Access基本原理二、Seed2Key DLL生成GenerateKeyEx源码自定义安全算法源码CAPL调用27服务解密算法前言 在实际诊断工程应用中,如UDS刷写——27服务,经常会遇到一些Seed2Key的算法问题,为了安全保密,这个算法的源码不便公开,我…

【C++基础】10. 指针

文章目录 【 1. 指针的定义 】【 2. 指针的调用 】【 3. NULL 空指针 】【 4. 指针的算术运算 】4.1 指针的递加4.2 指针的递减4.3 指针的比较 【 5. 指针与数组 】5.1 通过指针操作数组5.2 指针数组、数组指针 【 6. 指向指针的指针(多级间接寻址)】【 7. 传递指针给函数 】【…

【Vue面试题二十七】、你了解axios的原理吗?有看过它的源码吗?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说下你的vue项目的目录结…

第三章 内存管理 四、连续分配管理方式

目录 一、内存空间的分配与回收 1、连续分配管理方式 &#xff08;1&#xff09;、单一连续分配 优点&#xff1a; 缺点&#xff1a; &#xff08;2&#xff09;、固定分区分配 分区大小相等&#xff1a; 分区大小不等&#xff1a; &#xff08;3&#xff09;、动态分区…

leetcode17.04面试题:消失的数字

数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 思路1&#xff1a;暴力枚举 定义一个[0~n]的数组与所给数组nums进行循环遍历&#xff0c;如果不相等则返回那个数。 int missingNumber(int…

Git 安装和配置教程:Windows / Mac / Linux 三平台详细图文教程,带你一次性搞定 Git 环境

Git是一款免费、开源的分布式版本控制系统&#xff0c;广泛应用于软件开发领域。随着开源和云计算的发展&#xff0c;Git已经成为了开发者必备的工具之一。本文将为大家介绍Git在Windows、Mac和Linux三个平台上的安装和配置方法&#xff0c;带你一次性搞定Git环境 Windows平台 …