力扣714. 买卖股票的最佳时机含手续费(java 动态规划)

news2024/11/28 9:21:43

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

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述在这里插入图片描述

思路

1.构建多阶段决策模型:n天对应n个阶段,每个阶段决策:买股票、卖股票、不操作;买股票只有当前不持有股票才行,卖股票只有当前持有股票才行,不操作无规则。
2.定义状态:每天有两种状态:持有股票、不持有股票。int dp[n][2]记录每个阶段的状态,dp[i][0]表示第i天持有股票可以获得的最大利润,dp[i][1]表示第i天不持有股票可以获得的最大利润。
3.定义状态转移方程:dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]);即表示若当前持有股票则取出前一天持有股票的最大利润和不持有股票最大利润但减去当前的股票值二者中的最大值。其中dp[i - 1][1] - prices[i]就是表示:由于当前是持有股票,所有假设上一步不持有股票则当前的利润是要在上一步不持有股票最大利润的基础上减去当前购入股票(prices[i])花费的价格,dp[i][1] = Math.max(dp[i][1], dp[i][0] + prices[i] - fee);即表示若当前不持有股票,则取出上一步不持有股票可以获得的最大利润和上一步持有股票再加上当前股票值(prices[i])减去fee得到的利润二者中的最大值。其中dp[i][0] + prices[i] - fee是表示由于当前是不持有股票所以在上一步持有股票可以获得最大利润的基础上再去减去当前股票价格和交易费,则表示当前不再持有股票

解题方法

1.获取数组prices的长度n并申请一个int类型的二维数组(int[][] dp = new int[n][2])其中dp[i][0],与dp[i][1]表示的意义同上述思路;
2.初始化dp[0][0]为-prices[0],表示最开始买入一个股票需要花费;dp[0][1]为0,表示最开始不持有股票可获得最大利润为0;
3.从第一个位置开始完成动态转移方程;
4.返回max(dp[n - 1][0], dp[n - 1][1]);

复杂度

时间复杂度:

O ( n ) O(n) O(n)其中 n n n表示prices数组的大小

空间复杂度:

O ( n ) O(n) O(n)

Code

class Solution {
    /**
     * Dynamic programming
     *
     * @param prices The price of stock
     * @param fee    Handling charge
     * @return int
     */
    public int maxProfit(int[] prices, int fee) {
        int n = prices.length;
        //Recode the maximum profit
        int[][] dp = new int[n][2];
        //dp[i][0] represents the maximum profit
        // that can be made from holding the stock
        dp[0][0] = -prices[0];
        //dp[i][1] represents the maximum profit
        // that can be made by not holding the stock
        dp[0][1] = 0;
        for (int i = 1; i < n; ++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[n - 1][0], dp[n - 1][1]);
    }
}

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

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

相关文章

IntelliJ IDEA 拉取gitlab项目

一、准备好Gitlab服务器及项目 http://192.168.31.104/root/com.saas.swaggerdemogit 二、打开 IntelliJ IDEA安装插件 打开GitLab上的项目&#xff0c;输入项目地址 http://192.168.31.104/root/com.saas.swaggerdemogit 弹出输入登录用户名密码&#xff0c;完成。 操作Comm…

【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​ 目录 堆排序 第一种 ​编辑 第二种 …

Linux开发工具:yum、vim、gcc/g++、makefile

文章目录 一. Linux软件包管理器-yum使用1. Linux 安装软件的方式2. yum 三板斧yum listyum installyum remove 二. Linux编辑器-vim使用1. vim 的基本概念2. vim 的基本操作3. vim 的命令模式命令集4. vim 底行模式命令集 三. Linux编译器-gcc/g使用1. 快速使用2. 程序翻译过程…

【Linux】文件系统与软硬连接

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb; 磁盘HDD的物理存储结构磁盘的逻辑抽象…

element-ui Vue 封装组件按钮工具栏,使用slot插槽

封装常用按钮工具栏,方便其它页面调用 缺点:工具栏下面div会显示工具栏下面,下面需要使用margin-top:40px(小学生一个没整明白)希望大神能帮解决 运行效果 组件代码 tt-btnBar.vue <template><div><div class"btnbarP"><div class"btnbar…

【C语言】详解文件与文件操作

1.什么是文件 文件是记录在外存上的相关信息的命名组合&#xff0c;但是在程序设计中&#xff0c;我们⼀般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09;。 1.1程序文件 程序文件包括&#xff1a; 源程序文件 &#xff0…

Pytorch基础知识点复习

文章目录 并行计算单卡训练多卡训练单机多卡DP多机多卡DDPDP 与 DDP 的优缺点 PyTorch的主要组成模块Pytorch的主要组成模块包括那些呢&#xff1f;Dataset和DataLoader的作用是什么&#xff0c;我们如何构建自己的Dataset和DataLoader&#xff1f;神经网络的一般构造方法&…

头部姿态估计算法原理

人脸检测 文章目录 人脸检测一、前言二、原理三、代码实现 一、前言 头部姿态估计是通过一幅面部图像来获得头部的姿态角. 在3D空间中&#xff0c;表示物体的旋转可以由三个欧拉角(Euler Angle)来表示&#xff1a;分别计算 pitch(围绕X轴旋转)&#xff0c;yaw(围绕Y轴旋转) 和…

网络新手必读!CentOS 7系统IP配置与防火墙管理攻略

前言 掌握CentOS 7系统的网络配置技能&#xff0c;从IP地址、子网掩码、DNS到防火墙&#xff0c;一篇文章全搞定&#xff01;无论你是网络新手还是寻求深入了解的高手&#xff0c;这篇文章都为你提供了简单易懂的配置指南&#xff0c;助你轻松驾驭系统网络。摆脱繁琐的配置困扰…

C# 图解教程 第5版 —— 第23章 异常

文章目录 23.1 什么是异常23.2 try 语句23.3 异常类23.4 catch 子句23.5 异常过滤器23.6 catch 子句段23.7 finally 块23.8 为异常寻找处理程序23.9 进一步搜索23.9.1 一般法则23.9.2 搜索调用栈的示例&#xff08;*&#xff09; 23.10 抛出异常23.11 不带异常对象的抛出23.12 …

基于变换域的模版匹配

模板匹配原理 图像的空间域与其他域之间的变换&#xff0c;如傅里叶变换&#xff0c;小波变换&#xff0c;轮廓波变换&#xff0c;剪切波变换等&#xff0c;实际上是图像在其他坐标领域中的表现。在空间域中&#xff0c;图像的信息是像素值和坐标位置&#xff1b;在其他域中&a…

快速上手!LLaMa-Factory最新微调实践,轻松实现专属大模型

1.为什么要对Yuan2.0做微调&#xff1f; Yuan2.0&#xff08;https://huggingface.co/IEITYuan&#xff09;是浪潮信息发布的新一代基础语言大模型&#xff0c;该模型拥有优异的数学、代码能力。自发布以来&#xff0c;Yuan2.0已经受到了业界广泛的关注。当前Yuan2.0已经开源…

day19【LeetCode力扣】160.相交链表

day19【LeetCode力扣】160.相交链表 1.题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交**&#xff1a;** 题目数据 保证 整个链…

基于MATLAB计算无线通信覆盖(一)环境准备

一、环境 MATLAB 2022b 注&#xff1a;开始仿真前需部署地理坐标区和地理图&#xff0c;最好采用第三种&#xff0c;直接把底图数据下载到本地&#xff0c;防止连接不上网络时只能显示darkwater的底图。 可用于地理坐标区和地理图的底图如下表所示 二、下载底图并安装 工具&…

Intel开发环境Quartus、Eclipse与WSL的安装

PC &#xff1a;win10 64bit 安装顺序&#xff1a;先安装Quartus 21.4&#xff0c;接着Eclipse或者WSL&#xff08;Windows Subsystem for Linux&#xff09;&#xff0c;Eclipse与WSL的安装不分先后。 为什么要安装Eclipse&#xff1f; 因为Eclipse可以开发基于Nios II的C/…

RabbitMQ使用篇

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

CTF CRYPTO 密码学-1

题目名称&#xff1a;enc 题目描述&#xff1a; 压缩包中含两个文件&#xff1a;一个秘钥d.dec&#xff0c;一个密文flag.enc 解题过程&#xff1a; Step1&#xff1a;这题是一个解密他题目&#xff0c;尝试openssl去ras解密 工具简介 在Kali Linux系统中&#xff0c;openss…

交友系统程序开发,前后端源码交付,允许二开,UI配色新颖,APP小程序H5随心搭配!

在开发设计与测试阶段&#xff0c;主要包括了程序开发、测试和上线运营等环节。根据产品经理确定的功能需求&#xff0c;开发团队开始进行具体的编程和开发工作。这个过程中需要考虑到不同设备、不同系统和不同版本的需求&#xff0c;确保软件可以在不同平台上稳定运行。 测试是…

通过指令反向翻译进行自我对齐

1、写作动机&#xff1a; 对齐大型语言模型以执行指导性任务通常需要在大量人工标注的指令或偏好信息上进行微调&#xff0c;然而&#xff0c;使用此类高质量数据对指令遵循任务进行标注是难以扩展的。 2、贡献&#xff1a; 提出了一种可扩展的方法&#xff0c;通过自动标注…

【问题记录】使用命令语句从kaggle中下载数据集

从Kaggle中下载Tusimple数据集 1.服务器环境中安装kaggle 使用命令&#xff1a;pip install kaggle 2.复制下载API 具体命令如下&#xff1a; kaggle datasets download -d manideep1108/tusimple3.配置kaggle.json文件 如果直接使用命令会报错&#xff1a; root:~# kagg…