返回

动态编程算法:「前端刷题」122. 买卖股票的最佳时机 II(中等难度)

前端

引言

在充满活力的金融市场中,投资者总是在寻求利用价格波动的最佳时机来获取利润。在本文中,我们将深入探讨「买卖股票的最佳时机 II」,一个经典的动态编程问题,它展示了如何在股票价格的起伏变动中最大化收益。

问题陈述

给你一个整数数组 prices ,其中 prices[i] 表示股票在第 i 天时的价格。你的目标是找到一个买卖股票多次,且最终获得最大利润的策略。允许你持有股票任意天数。注意,你不能同时持有和出售股票。

动态编程解法

要解决这个问题,我们将采用动态编程的方法。假设 dp[i][j] 表示在第 i 天持有 j 股股票的最大利润。我们有两种选择:

1. 持有股票:

dp[i][j] = dp[i-1][j]

2. 卖出股票:

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

  • dp[i-1][j-1] + prices[i]:表示在第 i-1 天持有 j-1 股股票,然后在第 i 天卖出 1 股,获得的利润。
  • dp[i-1][j]:表示在第 i-1 天持有 j 股股票,然后在第 i 天继续持有,利润保持不变。

初始化

  • dp[0][0] = 0:表示在第 0 天持有 0 股股票,利润为 0
  • dp[0][j] = -prices[0] * jj > 0):表示在第 0 天持有 j 股股票,需要付出购买成本。

最终结果

要找到最大利润,我们需要找到所有可能的最终状态 dp[i][j]i = n-1j = 0~n)中的最大值,其中 n 是股票价格数组 prices 的长度。

示例

对于输入 prices = [7, 1, 5, 3, 6, 4],动态编程算法会得到以下收益表:

i j dp[i][j]
0 0 0
1 0 -7
1 1 -6
2 0 -7
2 1 -2
2 2 3
3 0 -7
3 1 -4
3 2 2
3 3 6
4 0 -7
4 1 -1
4 2 4
4 3 8
4 4 12

因此,最大利润为 12,可以在第 2 天买入股票,第 4 天卖出。

总结

通过使用动态编程算法,我们可以有效地解决「买卖股票的最佳时机 II」问题,从而在股票价格的波动中获得最大利润。这种算法不仅适用于该特定问题,还为解决其他类似的优化问题提供了通用框架。

面向未来的展望

了解了这个经典的动态编程算法后,你可以深入研究更复杂的股票交易问题,例如「买卖股票的最佳时机 III」和「买卖股票的最佳时机 IV」,以进一步提升你的算法技能和对金融市场的理解。