首页 > 编程语言 >代码随想录算法训练营day41| 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

代码随想录算法训练营day41| 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

时间:2024-11-09 20:30:11浏览次数:1  
标签:持股 状态 买卖 股票 length 最佳时机 max prices dp

学习资料:https://programmercarl.com/0188.买卖股票的最佳时机IV.html#算法公开课

动态规划之股票系列(2)

主要是要分持股状态来讨论各种情况,并由前一天的情况来讨论今天的金额

学习记录:
188.买卖股票的最佳时机IV(相当于2k+1维度)

点击查看代码
class Solution:
    def maxProfit(self, k: int, prices: List[int]) -> int:
        # 跟只能买卖两次异曲同工
        length = len(prices)
        if length == 0:
            return 0
        
        # 构造dp为j维数组 dp[i][j]代表第i天的状态为j
        dp = [[0]*(2*k+1) for _ in range(length)]
        # 初始化,这里对第1天的各种卖出状态进行初始化
        for j in range(1, 2*k, 2):
            # j状态,如0代表无操作,1代表第一次持股状态,2代表第一次不持股状态……
            dp[0][j] = -prices[0]   # 只要是1、3、5等状态就是持股状态,对于第一天而言,就是把钱花出去的状态,没有任何盈利
        # 开始遍历
        for i in range(1, length):
            for j in range(0, 2*k-1, 2):
                # 递推公式,第i天的状态可以分为持股j+1和不持股j+2得到
                dp[i][j+1] = max(dp[i-1][j+1], dp[i-1][j]-prices[i])
                dp[i][j+2] = max(dp[i-1][j+2], dp[i-1][j+1]+prices[i])
        return dp[-1][2*k]

        

309.最佳买卖股票时机含冷冻期(要考虑今天卖和冷冻期和不持股和持股四种状态)

点击查看代码
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        # 设置四个状态分析
        # 0:持股状态;1:不持股状态(不是今天卖也不是冷冻期);2:今天卖出股票;3:冷冻期
        # 构造dp数组
        length = len(prices)
        dp = [[0]*4 for _ in range(length)]
        # 初始化,第一天的各种情况
        dp[0][0] = -prices[0] # 第一天就买股
        dp[0][1] = 0  # 是不正常的状态,需要根据递推公式来确定设置为多少,可以举例判断
        dp[0][2] = 0
        dp[0][3] = 0
        # 开始遍历
        for i in range(1, length):
            # 若今天持股则昨天有三种可能状态:昨天持股,昨天不持股今天买入,昨天冷冻期今天买入(难点:昨天不可能卖出,不然今天冷冻买不了)
            dp[i][0] = max(dp[i-1][0], max(dp[i-1][1], dp[i-1][3])-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[-1][1], dp[-1][2],dp[-1][3])  # 要最大利润,最后一天必为各种无股状态
        

714.买卖股票的最佳时机含手续费(只考虑两种状态持股或不持股,只是卖的时候要多加个手续费)

点击查看代码
class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        length = len(prices)
        # 几种状态:0持股,1不持股
        dp = [[0]*2 for _ in range(length)]
        dp[0][0] = -prices[0]  # 买入股票不要手续费,要卖出才是一次完整的交易

        for i in range(1, length):
            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[-1][1], dp[-1][0])
        

PS:今天下了很小的雨,又是面试的一天,爽,吃美食,好困终于要到周末了

标签:持股,状态,买卖,股票,length,最佳时机,max,prices,dp
From: https://www.cnblogs.com/tristan241001/p/18537249

相关文章

  • 44-best-time-to-buy-and-sell-stock-with-cooldown 力扣 309. 买卖股票的最佳时机包
    买卖股票系列【leetcode】40-best-time-to-buy-and-sell-stock力扣121.买卖股票的最佳时机【leetcode】41-best-time-to-buy-and-sell-stock-ii力扣122.买卖股票的最佳时机II【leetcode】42-best-time-to-buy-and-sell-stock-iii力扣123.买卖股票的最佳时机III【le......
  • LeetCode100之买卖股票的最佳时机含冷冻期(309)--Java
    1.问题描述   给定一个整数数组prices,其中第  prices[i] 表示第 i 天的股票价格。​设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票(即冷冻期为1天)。        注意......
  • 42-best-time-to-buy-and-sell-stock-iii 力扣 123. 买卖股票的最佳时机 III
    买卖股票系列【leetcode】40-best-time-to-buy-and-sell-stock力扣121.买卖股票的最佳时机【leetcode】41-best-time-to-buy-and-sell-stock-ii力扣122.买卖股票的最佳时机II【leetcode】42-best-time-to-buy-and-sell-stock-iii力扣123.买卖股票的最佳时机III【le......
  • 代码随想录算法训练营day39 day40| 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
    学习资料:https://programmercarl.com/0198.打家劫舍.html#算法公开课动态规划的打家劫舍系列和股票买卖系列(股票还有贪心算法可解)学习记录:198.打家劫舍(一维dp数组,前n间房子都可偷的情况下的最高金额,每间房子偷数都是由前一间和前两间决定)点击查看代码classSolution(object)......
  • Day14买卖股票的最佳时机
    给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润......
  • 毕业设计:python股票推荐系统 数据分析可视化 协同过滤推荐算法 Django框架(源码+论文)✅
    毕业设计:python股票推荐系统数据分析可视化协同过滤推荐算法Django框架(源码+论文)✅1、项目介绍技术栈:python、django框架、requests、BeautifulSoup、协同过滤算法、Echarts可视化、HTML登录注册界面:用户可以注册新账号并登录系统。个人信息修改:用户可以修改个人信......
  • 【leetcode】40-best-time-to-buy-and-sell-stock 力扣 121. 买卖股票的最佳时机
    买卖股票系列【leetcode】40-best-time-to-buy-and-sell-stock力扣121.买卖股票的最佳时机【leetcode】41-best-time-to-buy-and-sell-stock-ii力扣122.买卖股票的最佳时机II【leetcode】42-best-time-to-buy-and-sell-stock-iii力扣123.买卖股票的最佳时机III【le......
  • 买卖股票问题
    1.只能买卖一次贪心2.可以买卖无限次线性DP3.最多买两次4.最多买卖\(k\)次5.可以买卖无限次,含冷冻期6.可以买卖无限次,含手续费......
  • 实时金融股票数据API接口websocket接入方法
    一、使用websocket的协议提升传输速度实时金融股票数据对于投资者和交易员来说至关重要。通过使用WebSocket接入方法,可以轻松获取实时金融股票类数据并及时做出决策。WebSocket是一种高效的双向通信协议,它允许数据的实时推送,避免了不断的轮询请求。这种接入方法具有多个优势。......
  • 深度学习模型能怎样用于股票价格点预测?
    炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):......