区间动态规划例题:带冷冻期的股票买卖问题(最多完成k笔交易)
字数 1411 2025-11-25 05:02:08

区间动态规划例题:带冷冻期的股票买卖问题(最多完成k笔交易)

题目描述
给定一个整数数组 prices,其中 prices[i] 表示第 i 天的股票价格,以及一个整数 k,表示你最多可以完成的交易次数(买入和卖出合为一笔交易)。在每次交易完成后(即卖出股票后),你无法在接下来的一天买入股票(即存在一天的冷冻期)。请你计算在满足最多交易 k 次且带有冷冻期的条件下,能够获得的最大利润。

示例
输入:prices = [1,2,3,0,2], k = 2
输出:3
解释:交易序列为:买入(第1天,价格1)、卖出(第2天,价格2,利润1)、冷冻(第3天)、买入(第4天,价格0)、卖出(第5天,价格2,利润2)。总利润 = 1 + 2 = 3。

解题过程

  1. 状态定义
    定义三维动态规划数组 dp[i][j][0]dp[i][j][1]

    • i 表示天数(从 0 到 n-1)。
    • j 表示已完成的交易次数(从 0 到 k)。
    • dp[i][j][0] 表示第 i 天结束时,已完成 j 笔交易,且当前未持有股票的最大利润。
    • dp[i][j][1] 表示第 i 天结束时,已完成 j 笔交易,且当前持有股票的最大利润。
  2. 状态转移方程

    • 对于 dp[i][j][0](未持有股票):
      • 可能由前一天未持有股票继承:dp[i-1][j][0]
      • 或由前一天持有股票并在当天卖出(完成一笔交易):dp[i-1][j-1][1] + prices[i](需 j >= 1)。
        转移方程:
        dp[i][j][0] = max(dp[i-1][j][0], dp[i-1][j-1][1] + prices[i])
    • 对于 dp[i][j][1](持有股票):
      • 可能由前一天持有股票继承:dp[i-1][j][1]
      • 或由前两天(因冷冻期)未持有股票并在当天买入:dp[i-2][j][0] - prices[i](若 i >= 2,否则为 -prices[i])。
        转移方程:
        dp[i][j][1] = max(dp[i-1][j][1], (i >= 2 ? dp[i-2][j][0] : 0) - prices[i])
  3. 初始化

    • 第 0 天(i=0):
      • dp[0][j][0] = 0(未持有,未交易)。
      • dp[0][j][1] = -prices[0](持有,买入股票)。
    • 对于 j=0(未交易):
      • dp[i][0][0] = 0
      • dp[i][0][1] = max(-prices[0], -prices[i])(实际可简化为持续不买或第一天买入)。
  4. 遍历顺序
    按天数 i 从 0 到 n-1 遍历,对每个 i 遍历交易次数 j 从 0 到 k

  5. 答案提取
    最大利润为所有 dp[n-1][j][0]j 从 0 到 k)中的最大值,因为最后一天未持有股票才能实现利润。

关键点

  • 冷冻期体现在持有股票的状态只能由前两天的未持有状态转移而来。
  • 交易次数限制要求对 j 进行遍历,并在卖出时增加交易计数。
  • 初始化需注意边界条件(如 i=0j=0)。

通过以上步骤,可系统解决带冷冻期的股票买卖问题,确保在交易次数限制下最大化利润。

区间动态规划例题:带冷冻期的股票买卖问题(最多完成k笔交易) 题目描述 给定一个整数数组 prices ,其中 prices[i] 表示第 i 天的股票价格,以及一个整数 k ,表示你最多可以完成的交易次数(买入和卖出合为一笔交易)。在每次交易完成后(即卖出股票后),你无法在接下来的 一天 买入股票(即存在一天的冷冻期)。请你计算在满足最多交易 k 次且带有冷冻期的条件下,能够获得的最大利润。 示例 输入: prices = [1,2,3,0,2] , k = 2 输出: 3 解释:交易序列为:买入(第1天,价格1)、卖出(第2天,价格2,利润1)、冷冻(第3天)、买入(第4天,价格0)、卖出(第5天,价格2,利润2)。总利润 = 1 + 2 = 3。 解题过程 状态定义 定义三维动态规划数组 dp[i][j][0] 和 dp[i][j][1] : i 表示天数(从 0 到 n-1 )。 j 表示已完成的交易次数(从 0 到 k )。 dp[i][j][0] 表示第 i 天结束时,已完成 j 笔交易,且当前 未持有 股票的最大利润。 dp[i][j][1] 表示第 i 天结束时,已完成 j 笔交易,且当前 持有 股票的最大利润。 状态转移方程 对于 dp[i][j][0] (未持有股票): 可能由前一天未持有股票继承: dp[i-1][j][0] 。 或由前一天持有股票并在当天卖出(完成一笔交易): dp[i-1][j-1][1] + prices[i] (需 j >= 1 )。 转移方程: dp[i][j][0] = max(dp[i-1][j][0], dp[i-1][j-1][1] + prices[i]) 对于 dp[i][j][1] (持有股票): 可能由前一天持有股票继承: dp[i-1][j][1] 。 或由前两天(因冷冻期)未持有股票并在当天买入: dp[i-2][j][0] - prices[i] (若 i >= 2 ,否则为 -prices[i] )。 转移方程: dp[i][j][1] = max(dp[i-1][j][1], (i >= 2 ? dp[i-2][j][0] : 0) - prices[i]) 初始化 第 0 天( i=0 ): dp[0][j][0] = 0 (未持有,未交易)。 dp[0][j][1] = -prices[0] (持有,买入股票)。 对于 j=0 (未交易): dp[i][0][0] = 0 。 dp[i][0][1] = max(-prices[0], -prices[i]) (实际可简化为持续不买或第一天买入)。 遍历顺序 按天数 i 从 0 到 n-1 遍历,对每个 i 遍历交易次数 j 从 0 到 k 。 答案提取 最大利润为所有 dp[n-1][j][0] ( j 从 0 到 k )中的最大值,因为最后一天未持有股票才能实现利润。 关键点 冷冻期体现在持有股票的状态只能由 前两天 的未持有状态转移而来。 交易次数限制要求对 j 进行遍历,并在卖出时增加交易计数。 初始化需注意边界条件(如 i=0 和 j=0 )。 通过以上步骤,可系统解决带冷冻期的股票买卖问题,确保在交易次数限制下最大化利润。