1. 问题描述:

给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例 1:

输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:8
解释:能够达到的最大利润:  
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8

示例 2:

输入:prices = [1,3,7,5,10,3], fee = 3
输出:6

提示:

1 <= prices.length <= 5 * 10 ^ 4
1 <= prices[i] < 5 * 10 ^ 4
0 <= fee < 5 * 10 ^ 4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee

2. 思路分析:

股票问题属于经典的状态机dp问题,我们需要根据题目的描述画出对应的状态转移图,根据状态之间的转移递推得到当前状态的dp值即可,弄清楚了有多少个状态,状态之间的转移就很好解决了,可以发现题目中存在两个状态,分别为:手中持有股票和手中没有股票,手中有股票可以选择卖出或者不卖,手中没有股票可以选择买入和不买,因为每一笔的交易都存在手续费,所以我们只需要在当前手中持有股票或者没有股票的时候减去对应的手续费即可(任何一个即可,因为到买当前股票的时候是一定会减掉的)。

3. 代码如下:

from typing import Listclass Solution:# 股票问题是经典的状态机问题def maxProfit(self, prices: List[int], fee: int) -> int:INF = 10 ** 8n = len(prices)dp = [[-INF] * 2 for i in range(n + 1)]# 当前没有股票dp[0][0] = 0res = 0for i in range(1, n + 1):# 0表示手中没有股票, 因为每一次交易只需要计算一次手续费所以在持有当前股票或者手中没有股票的时候减去手续费都可以, 最终都是会被减去这个手续费的dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i - 1] - fee)# 1表示手中持有股票dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i - 1])# 当前卖完股票的获得的最大值res = max(res, dp[i][0])return res

714 买卖股票的最佳时机含手续费(状态机dp)相关推荐

  1. leetcode 714. 买卖股票的最佳时机含手续费(dp)

    给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :非负整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每笔交易都需要付手续费.如果你已经购买了一个 ...

  2. 714. 买卖股票的最佳时机含手续费(CPP)

    714. 买卖股票的最佳时机含手续费 给定一个整数数组 pricespricesprices,其中第 iii 个元素代表了第 iii 天的股票价格 :非负整数 feefeefee 代表了交易股票的手续 ...

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

    714. 买卖股票的最佳时机含手续费 题目 思路 过一遍,记录第i天是否买入和卖出的最值. 代码 class Solution {public:int maxProfit(vector<int& ...

  4. 【算法】贪心算法:LeetCode 714 买卖股票的最佳时机含手续费 、LeetCode 968 监控二叉树

    LeetCode 714 买卖股票的最佳时机含手续费 (中等) 题目 描述 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你 ...

  5. Leetcode刷题笔记 714. 买卖股票的最佳时机含手续费

    714. 买卖股票的最佳时机含手续费 时间:2020年12月17日 知识点:动态规划 题目链接:https://leetcode-cn.com/problems/best-time-to-buy-an ...

  6. 【LeetCode每日一题】——714.买卖股票的最佳时机含手续费

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[解题思路] 七[题目提示] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 贪心算法 二[ ...

  7. leetcode 714 买卖股票的最佳时机含手续费-动态规划(中等)

    714 买卖股票的最佳时机含手续费-动态规划(中等) 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :非负整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交 ...

  8. 模拟卷Leetcode【普通】714. 买卖股票的最佳时机含手续费

    714. 买卖股票的最佳时机含手续费 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每笔交易都 ...

  9. 力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树

    文章目录 738. 单调递增的数字 思路 难点:遍历顺序 难点:设置flag 714. 买卖股票的最佳时机含手续费 贪心思路 难点 968. 监控二叉树 思路 难点:如何隔两个节点放一个摄像头 738 ...

  10. 力扣算法JS LC [714. 买卖股票的最佳时机含手续费] LC [968. 监控二叉树]

    LC 714. 买卖股票的最佳时机含手续费 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你 ...

最新文章

  1. Python必备基本技能——命令行参数args详解
  2. [dp] Jzoj P5804 简单的序列
  3. 二十七、事务隔离级别示例
  4. Java数据结构和算法:哈希表
  5. HTML5 Canvas游戏开发(一)基础知识
  6. Hadoop之Yarn面试知识复习
  7. 新手一小时就写出人工智能应用 - 看图识熊
  8. keybd_event()使用方法
  9. JS实现new关键字的功能
  10. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_4_使用Lambda优化日志案例...
  11. 一维码,二维码,com.google.zxing
  12. QT所有版本和VS插件下载
  13. MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/...
  14. Flink 灵魂两百问,这谁顶得住?
  15. aws的sdk异常 unable to execute HTTP ec2-north-1.amazonaws
  16. 微信小程序用户登录信息过期处理
  17. lol微信登录服务器,lol开放微信登录功能 lol微信怎么登陆
  18. angr学习之ctf练习
  19. Unity2D 官方骨骼动画Anima2D使用方法
  20. 华为服务器怎么安装win7系统教程,华为台式机如何安装系统win7

热门文章

  1. idea出现Cannot find keymap “Windows copy的报错“
  2. Spring Hibernate Validation
  3. Validation进行参数校验
  4. SQL 语句单引号、双引号的用法
  5. OpenCV Python 图像矩阵的均值和标准差
  6. 【和76】龙头企业在区域市场中竞合关系分析样例(温微观察13-6)
  7. Web服务器环境的搭建
  8. 键盘侠小心了!微博或将推出“杠精”示众功能
  9. 生产仓储条码外贸管理解决方案
  10. Android快捷方式解密