返回

勇破难关!掌握买卖股票的最佳时机 III:分段利润最大化

前端

前情回顾:股票交易的最佳时机

在《买卖股票的最佳时机 I》和《买卖股票的最佳时机 II》中,我们分别探讨了在只能买入、卖出一次的条件下,如何获取最大利润以及在无限次交易的前提下如何实现利润最大化。这些问题为我们提供了重要的基础知识,有助于我们理解和解决《买卖股票的最佳时机 III》。

买入与卖出的艺术

《买卖股票的最佳时机 III》的主要目的是在最多只能买入两次的限制下,寻找最佳的买入和卖出时机,实现利润最大化。这与前两个问题有着本质的区别,因为它要求我们考虑交易的次数和交易的顺序。

状态转移方程:捕捉动态变化

为了解决《买卖股票的最佳时机 III》,我们需要借助动态规划的思想,构建状态转移方程。设 dp[i][k][0] 表示在第 i 天,最多交易 k 次,且目前持有股票的状态下的最大利润。设 dp[i][k][1] 表示在第 i 天,最多交易 k 次,且目前不持有股票的状态下的最大利润。

递推公式:揭示状态间的联系

有了状态转移方程,我们就可以通过递推的方式计算出最终的结果。具体来说,递推公式如下:

dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k-1][1] + prices[i])
dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k][0] - prices[i])

滚动数组:节省空间,提高效率

为了优化空间复杂度,我们可以使用滚动数组的方式来保存中间结果。具体来说,我们可以将 dp[i-1]dp[i] 两个数组合并成一个数组,然后通过循环来更新数组中的值。

实例详解:一步步走向最优解

为了更好地理解《买卖股票的最佳时机 III》,我们来看一个具体的例子。假设股票价格序列为 [3, 2, 6, 5, 0, 3],且最多只能交易两次。

步一:初始化状态

首先,我们需要初始化 dp 数组。对于 dp[0][k][0]dp[0][k][1],我们都将其初始化为 0,因为在第一天,我们不可能持有股票或进行交易。

步二:计算动态规划表

然后,我们可以使用递推公式来计算动态规划表。具体来说,我们可以从 i = 1 开始循环,并在每次循环中计算 dp[i][k][0]dp[i][k][1] 的值。

步三:找出最佳利润

最后,我们需要找到最佳利润。最佳利润就是 dp[n-1][k][0],其中 n 是股票价格序列的长度,k 是最多交易的次数。

掌握技巧,笑傲股海

《买卖股票的最佳时机 III》是一道具有挑战性的问题,但只要我们掌握了动态规划的思想和递推公式的构造方法,就可以将其轻松解决。更重要的是,这一系列问题不仅考验了我们的编程能力,也磨练了我们对金融市场和投资策略的理解。希望大家都能在股票交易的世界中驰骋纵横,笑傲股海!