动态规划实现买卖股票的最佳时间
时间: 2024-01-07 21:22:38 浏览: 97
动态规划可以用来实现买卖股票的最佳时间。下面是一个动态规划的实现方法:
1. 定义状态:
- `dp[i][j][k]` 表示第 i 天,进行了 j 次交易,持有状态为 k(0 表示未持有,1 表示持有)时的最大利润。
2. 初始化状态:
- `dp[j] = 0`,第 0 天未进行交易且未持有股票时的利润为 0。
- `dp[j] = -prices`,第 0 天未进行交易但持有股票时的利润为负的股票价格。
3. 状态转移方程:
- `dp[i][j] = max(dp[i-1][j][0], dp[i-1][j] + prices[i])`,第 i 天未持有股票的最大利润等于前一天未持有股票的最大利润和前一天持有股票但在第 i 天卖出的最大利润的较大值。
- `dp[i][j] = max(dp[i-1][j], dp[i-1][j-1] - prices[i])`,第 i 天持有股票的最大利润等于前一天持有股票的最大利润和前一天未持有股票但在第 i 天买入的最大利润的较大值。
4. 最终结果:
- 最大利润为 `dp[n-1][k]`,其中 n 是天数,k 是最大交易次数。
下面是一个示例代码:
```python
def maxProfit(prices, k):
n = len(prices)
if k > n // 2:
# 如果 k 大于 n 的一半,相当于可以进行任意多次交易
return maxProfitUnlimited(prices)
dp = [[[0] * 2 for _ in range(k+1)] for _ in range(n)]
for i in range(n):
for j in range(k, 0, -1):
if i == 0:
dp[i][j][0] = 0
dp[i][j][1] = -prices[i]
else:
dp[i][j][0] = max(dp[i-1][j][0], dp[i-1][j][1] + prices[i])
dp[i][j][1] = max(dp[i-1][j][1], dp[i-1][j-1][0] - prices[i])
return dp[n-1][k][0]
def maxProfitUnlimited(prices):
n = len(prices)
dp = [[0] * 2 for _ in range(n)]
for i in range(n):
if i == 0:
dp[i][0] = 0
dp[i][1] = -prices[i]
else:
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])
return dp[n-1][0]
```
阅读全文