1. 问题背景与核心挑战
股票交易问题是算法竞赛和量化金融领域的经典题型。这道题目要求我们在给定股价序列和交易次数限制下,计算出最大可能收益。看似简单的买卖操作背后,隐藏着动态规划的精妙设计。
在实际量化交易中,类似算法被广泛应用于高频交易策略优化。比如某对冲基金需要在一分钟内完成数十次交易决策,就必须精确计算有限次数下的最优买卖点。这道题正是这类问题的简化模型。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与边界处理
2.1 输入输出理解
给定股价序列 [3, 2, 6, 5, 0, 3] 和 k=2:
- 最佳策略:第2天(2元)买入,第3天(6元)卖出;第5天(0元)买入,第6天(3元)卖出
- 总利润:(6-2)+(3-0)=7
2.2 关键边界条件
需要特别注意两种特殊情况:
- 当k ≥ 天数/2时:退化为无限次交易问题
- 当天数<2时:无法完成完整交易
提示:实际编码时应该先处理这些边界条件,避免后续复杂计算
3. 动态规划解法详解
3.1 状态定义
我们使用两个一维数组:
- buy[j]:完成第j次买入后的最大利润
- sell[j]:完成第j次卖出后的最大利润
初始化设置:
cpp复制vector<int> buy(k + 1, INT_MIN); // 初始化为最小值表示不可能状态
vector<int> sell(k + 1, 0); // 初始利润为0
3.2 状态转移方程
对于每一天的价格prices[i],更新所有交易次数状态:
cpp复制for(int j=1; j<=k; ++j){
// 第j次买入:要么保持原状态,要么用第j-1次卖出后的钱买入
buy[j] = max(buy[j], sell[j-1] - prices[i]);
// 第j次卖出:要么保持原状态,要么卖出当前持有的股票
sell[j] = max(sell[j], buy[j] + prices[i]);
}
3.3 复杂度分析
- 时间复杂度:O(n*k)
- 空间复杂度:O(k)
当k很大时(≥n/2),自动切换到贪心算法,复杂度降为O(n)
