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

给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例:

输入: 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.

思路:

  1. 动态规划
  2. 贪心算法

1、C++动态规划

定义状态:

首先来定义状态。一般问题要求什么,dp的值就定义成什么,那么dp[i]应该表示第i天的最大利润。但仅有天数的信息我们还无法推出状态转移方程,说明信息还不够。这时再分析题目:根据题意,当手上持有股票的时候就不能再继续买入。可见每天的状态无非就两种:持有股票和不持有股票。到这里dp的定义就出来了:dp[i][0]表示第i天交易完后手里没有股票的最大利润,dp[i][1]表示第i天交易完后手里持有股票的最大利润。

状态转移方程:

每天的动作总共有三种:买、卖、不动,而每一天的最大利润都可以由前一天的最大利润转移而来,综上不难得出:

dp[i][0]=max(dp[i−1][0],dp[i−1][1]+prices[i]−fee)dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee)dp[i][0]=max(dp[i−1][0],dp[i−1][1]+prices[i]−fee)

dp[i][1]=max(dp[i−1][1],dp[i−1][0]−prices[i])dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i])dp[i][1]=max(dp[i−1][1],dp[i−1][0]−prices[i])。

注意一开始dp的初始化。每次对dp数组进行初始化的要点就是根据“定义”去解释一开始的边界的含义。对于本题,$dp[0][0]=0,dp[0][1]=-price[0] $。

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

2、python-动态规划

由于第i天的状态只与第i-1天的状态有关,因此可以将d数组进行空间上的压缩,压缩为1维。d[0]\d[1]。

用buy表示d[1],sell表示d[0]。代码如下:

import numpy as np
class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:n = len(prices)buy = -prices[0]sell = 0 for i in range(1,n):new_buy = max(buy , sell-prices[i])new_sell = max(sell, buy+prices[i]-fee)buy = new_buysell = new_sellreturn sell

3、C+±贪心

思路:(在最低价时买入、最高价时卖出,依次操作)

把手续费转移到买入时支付(只要是在一次买卖当中支付手续费即可),我们就可以通过“尽可能最小化买入成本,最大化卖出价格”的贪心策略求得最大利润了。

设buy为在最大收益前提下,如果我们手上拥有一支股票,那么它的最低买入成本是多少。

所以我们在做收获利润操作的时候其实有三种情况:

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();int buy = prices[0]+fee;int res = 0;for(int i=1;i<n;i++){if(prices[i]+fee < buy){buy = prices[i]+fee;}if(prices[i] > buy){res += prices[i]-buy;buy = prices[i];}}return res;}
};

4、python–贪心

手续费在卖出时计算。

import numpy as np
class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:n = len(prices)buy = prices[0]res = 0for i in range(1,n):if(prices[i]<buy):buy = prices[i]if(prices[i]-fee > buy):res += prices[i]-fee-buybuy = prices[i]-feereturn res

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

  1. 110. Leetcode 714. 买卖股票的最佳时机含手续费 (动态规划-股票交易)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i]是一个长度为len(prices)的一维数组,表示的是在第i天持有股票 步骤二.推断状态方程: 第i天不持有股票,即dp[i][0], 那么两个状 ...

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

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

  3. 【贪心算法】Leetcode 714. 买卖股票的最佳时机含手续费

    [贪心算法]Leetcode 714. 买卖股票的最佳时机含手续费 题目 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. ...

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

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

  5. LeetCode·714.买卖股票的最佳时机含手续费·贪心

    作者:xun-ge-v 链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/sol ...

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

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

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

    贪心!!! class Solution {public int maxProfit(int[] prices, int fee) {int n = prices.length;int buy = p ...

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

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

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

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

最新文章

  1. jenkins同平台发布
  2. linux find 删除文件夹,linux中find与rm实现查找并删除目录或文件linux操作系统 -电脑资料...
  3. 如何解决 SQL Server 2000 中的连接问题
  4. IBM was调试端口开通演示,was服务重启、端口号查看方法
  5. Markdown设置字体大小、颜色...,CSDN博客编写设置字体大小、颜色、粗细。字体,文字背景设置。
  6. C++中接口与实现分离的技术
  7. Oracle 存储过程,函数和包。
  8. C#字节数组与值类型变量的互相转换,以及注意事项
  9. 设计模式到底离我们有多远
  10. 如何保证用户登陆时提交密码已经加密
  11. 面试题(用栈代替队列的操作和原生map实现)
  12. 碳酸铜行业调研报告 - 市场现状分析与发展前景预测
  13. 输出四位完全平方数_leetcode279_go_完全平方数
  14. go基础_defer
  15. Kubernetes 系统强化 Pod安全策略 PSP
  16. 分享一个微信公众号管理平台源码
  17. RPG游戏地图素材 2D像素风瓦片地图包 角色扮演独立游戏制作美术资源
  18. Android 使用VelocityTracker来获取滑动速度
  19. office365彻底卸载教程
  20. MacOS制作ubuntu18.04系统U盘启动盘

热门文章

  1. uniapp引用外部js_Uniapp怎么引入外部js
  2. c++ 箭头符号怎么打_c++笔记--重载箭头运算符
  3. 服务器电脑通电自动开机
  4. 使用NtCreateThreadEx将Dll注入目标进程
  5. 删除计算机自带的游戏软件,win10系统删除自带游戏的处理办法
  6. 2021湖南耒阳二中高考成绩查询,来自耒阳各校的高考喜报
  7. 智搜荣获用友·华为云杯开发者大赛“优秀商业应用奖”
  8. 【苹果推软件】Apple IOS推送证书 如何创建CSR文件
  9. MySQL——插入语句
  10. 利用CSS在图片中添加文字