题目列表
动态规划解题五步法
- dp 数组及其下标的含义
- 状态转移方程
- 初始化
- 遍历顺序
- 手动模拟
买卖股票的最佳时机 IV
思路分析
第一步:状态定义
这道题是'最多两次交易'的通用版(k 次),状态设计沿用'成对状态'的思路,用 dp[i][j] 表示第 i 天处于第 j 种状态时的最大现金。
- j 的取值范围是 0 ~ 2k,共 2k+1 种状态;
- 状态规则(按交易次数成对划分):
- j=0:无操作(初始状态);
- j=1:第 1 次持有股票(第 1 次买入后未卖出);
- j=2:第 1 次不持有股票(第 1 次卖出后,完成第 1 次交易);
- j=3:第 2 次持有股票(第 2 次买入后未卖出);
- j=4:第 2 次不持有股票(第 2 次卖出后,完成第 2 次交易);
- ...
- j=2m-1:第 m 次持有股票(1≤m≤k);
- j=2m:第 m 次不持有股票(1≤m≤k)。 核心逻辑:每一次完整交易对应'持有(奇数 j)+ 卖出(偶数 j)'两个状态,且第 m 次买入必须依赖第 m-1 次卖出的现金,严格遵循交易顺序。
第二步:状态转移方程
- 第 m 次持有(j=2m-1):dp[i][2m-1] = Math.max(dp[i-1][2m-1], dp[i-1][2m-2] - prices[i])
- 前一天已处于'第 m 次持有'状态,继续持有 → dp[i-1][2m-1];
- 当天完成第 m 次买入 → 用'第 m-1 次卖出后'的现金买入 → dp[i-1][2m-2] - prices[i]。
- 第 m 次卖出(j=2m):dp[i][2m] = Math.max(dp[i-1][2m], dp[i-1][2m-1] + prices[i])
- 前一天已完成第 m 次卖出,继续保持 → dp[i-1][2m];
- 当天卖出第 m 次持有的股票 → 前一天'第 m 次持有'的现金 + 当天卖出价格 → dp[i-1][2m-1] + prices[i]。 补充:j=0(无操作)始终满足 dp[i][0] = dp[i-1][0] = 0。
第三步:初始化
- dp[0][0] = 0:第 0 天无操作,现金为 0;
- 对于每一次交易 m(1≤m≤k):
- dp[0][2m-1] = -prices[0]:第 0 天完成第 m 次买入;
- dp[0][2m] = 0:第 0 天无法完成第 m 次卖出,初始为 0。
第四步:遍历顺序
- 外层循环:遍历天数(i 从 1 到 len-1);
- 内层循环:遍历交易次数(j 从 1 到 k),按'第 1 次→第 k 次'的顺序计算。 整体遍历顺序:先按天从左到右,再按交易次数从小到大。

