数据结构与算法:动态规划dp:买卖股票相关力扣题(下):309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费

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

首先我们要明确,如果全程只能买卖一次或者允许买卖多次,那么我们就没必要记录无操作 这个状态。
如果买卖的次数为k(k≥2),那么我们才要记录无操作这个状态,以此来区分具体是第几次买卖。

在这因为题目说了允许买卖多次,所以我们不需要记录无操作 这个状态。

同时因为含有冷冻期,所以我们需要将不持有股票这个状态再次细分,分为:

  • i天不持有股票,且第i天可以买但不可以卖。
  • i天卖出股票。
  • i天处于冷冻期。
python 复制代码
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        """
        dp[i][0],第i天持有股票时的最大利润
        dp[i][1],第i天不持有股票且,可以买但不可以卖时的最大利润
        dp[i][2],第i天不持有股票且,且就在第i天卖出时的最大利润
        dp[i][3],第i天不持有股票且,第i天处于冷冻期时的最大利润
        """
        n = len(prices)
        if n == 1:
            return 0
        dp = [[0] * 4 for _ in range(n)]
        """
        注意初始化不要写成[[0] * 4] * n,这会导致所有的行引用同一个列表对象
        使得在更新dp[i][j]时,所有行的第j列都会被更新。
        """
        dp[0][0] = -prices[0]
        for i in range(1, n):
            """
            对于 第i天持有股票的最大利润 ,可能由以下状态转移而来:
            1、第i-1天时便持有股票,第i天无操作。
            2、第i-1天时不持有股票且可以买不可以卖,第i天买入股票
            3、第i-1天时不持有股票且同时处于冷冻期,第i天买入股票
            """
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i], dp[i-1][3]-prices[i])

            
            """
            对于 第i天不持有股票且,可以买但不可以卖时的最大利润, 可能由以下状态转移而来:
            1、第i-1天不持有股票且,可以买但不可以卖。第i天无操作,从而延续第i-1天的状态
            2、第i-1天不持有股票且,第i-1天处于冷冻期。第i天无操作
            """ 
            dp[i][1] = max(dp[i-1][1], dp[i-1][3])

            """
            对于 第i天不持有股票且,且就在第i天卖出时的最大利润, 一定由以下状态转移而来:
            1、第i-1天时持有股票,第i-1天卖出股票
            """
            dp[i][2] =dp[i-1][0]+prices[i]

            """
            对于 第i天不持有股票且,第i天处于冷冻期时的最大利润, 一定由以下状态转移而来:
            1、第i-1天时不持有股票且,且就在第i-1天卖出。
            """
            dp[i][3] = dp[i-1][2]
        return max(dp[n-1][0], dp[n-1][1], dp[n-1][2], dp[n-1][3])

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

python 复制代码
class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        """
        手续费只在卖出时扣除。
        dp[i][0]代表第i天持有股票时的最大利润
        dp[i][1]代表第i天不持有股票时的最大利润
        """
        length = len(prices)
        if length== 1:
            return 0
        dp = [[0] * 2 for _ in range(length)]
        dp[0][0] = -prices[0]
        for i in range(1, length):
            """"
            第i天持有股票可能由以下状态转换而来:
            1、第i-1天持有股票,第i天无操作
            2、第i-1天不持有股票,第i天买入
            """
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i])
            """
            第i天不持有股票可能由以下状态转换而来:
            1、第i-1天持有股票,第i天卖出
            2、第i-1天不持有股票,第i天无操作     
            """
            dp[i][1] = max(dp[i-1][0]+prices[i]-fee, dp[i-1][1])
        return dp[length-1][1]

效率:245ms,击败32.03%

相关推荐
ZHW_AI课题组11 分钟前
腾讯云调用IP定位
人工智能·python·机器学习
zhaoshuzhaoshu28 分钟前
Python文件操作详细解析带例子
python
醒醒该学习了!29 分钟前
Anaconda安装教程+第一个python例子
开发语言·python
linyanRPA41 分钟前
影刀RPA+Python店群自动化实战:自研环境隔离引擎,200店铺并发不卡不串号
python·自动化·rpa
8Qi844 分钟前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS1 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
松间听晚2 小时前
Agentic RL 环境和代码学习:以HGPO为例
算法
智者知已应修善业2 小时前
【51单片机用T0定时器方式1,实现0.5S的时间间隔实现第一次一个灯亮、第二次二个灯亮,直到全部灯亮,然后重复整个过程】2023-12-29
c++·经验分享·笔记·算法·51单片机
小许同学记录成长2 小时前
几何体编辑与布尔运算
算法·无人机