引言
动态规划是解决多阶段决策过程最优化问题的有效方法。买卖股票问题是动态规划的经典应用场景,涉及状态转移、子问题划分及约束条件下的优化策略。本文将深入剖析含冷却期和含手续费两种常见变体,通过状态机建模与代码实现,帮助读者掌握此类问题的解法。
1. 买卖股票的最佳时机含冷却期
1.1 题目描述
给定一个数组,其中第 i 个元素表示第 i 天的股票价格。设计一个算法来计算最大利润。在完成一笔交易后(即卖出股票),无法立即再次购买股票(需要 1 天冷却期)。注意:不能同时参与多笔交易(必须在再次购买前出售掉之前的股票)。
1.2 思路分析
本题适合使用二维动态规划表配合状态机模型进行求解。定义三种状态:
- 买入/持有:第 i 天结束时持有股票。
- 可交易:第 i 天结束时未持有股票,且不在冷却期。
- 冷冻期:第 i 天结束时处于冷却期(通常由当天卖出导致)。
状态转移方程如下:
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i])
dp[i][1] = max(dp[i - 1][2], dp[i - 1][1])
dp[i][2] = dp[i - 1][0] + prices[i]
初始化:
第一天买入状态为 -prices[0],其余为 0。
返回值:
最后一天不持有股票的最大利润,即 max(dp[n - 1][1], dp[n - 1][2])。
1.3 代码实现
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if (n == 0) return 0;
vector<vector<>> (n, <>(, ));
dp[][] = -prices[];
( i = ; i < n; i++) {
dp[i][] = (dp[i - ][], dp[i - ][] - prices[i]);
dp[i][] = (dp[i][], dp[i][]);
dp[i][] = dp[i][] + prices[i];
}
(dp[n - ][], dp[n - ][]);
}
};


