返回
动态编程算法:「前端刷题」122. 买卖股票的最佳时机 II(中等难度)
前端
2023-09-02 01:01:54
引言
在充满活力的金融市场中,投资者总是在寻求利用价格波动的最佳时机来获取利润。在本文中,我们将深入探讨「买卖股票的最佳时机 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] * j
(j > 0
):表示在第0
天持有j
股股票,需要付出购买成本。
最终结果
要找到最大利润,我们需要找到所有可能的最终状态 dp[i][j]
(i = n-1
,j = 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」,以进一步提升你的算法技能和对金融市场的理解。