区间动态规划例题:带冷冻期的股票买卖问题(最多完成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。
解题过程
-
状态定义
定义三维动态规划数组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])(实际可简化为持续不买或第一天买入)。
- 第 0 天(
-
遍历顺序
按天数i从 0 到n-1遍历,对每个i遍历交易次数j从 0 到k。 -
答案提取
最大利润为所有dp[n-1][j][0](j从 0 到k)中的最大值,因为最后一天未持有股票才能实现利润。
关键点
- 冷冻期体现在持有股票的状态只能由前两天的未持有状态转移而来。
- 交易次数限制要求对
j进行遍历,并在卖出时增加交易计数。 - 初始化需注意边界条件(如
i=0和j=0)。
通过以上步骤,可系统解决带冷冻期的股票买卖问题,确保在交易次数限制下最大化利润。