当前位置:实例文章 » 其他实例» [文章]Day 43算法记录|动态规划 10(股票)

Day 43算法记录|动态规划 10(股票)

发布人:shili8 发布时间:2025-02-25 04:12 阅读次数:0

**Day43 算法记录 | 动态规划10 (股票)**在前面的日记中,我们已经学习了动态规划的基本概念和应用。今天,我们将继续深入探讨动态规划的另一个经典问题——股票买卖。

**股票买卖问题**

给定一个数组 `prices`,其中每个元素代表一天的股价。我们需要在不超过两次交易的情况下,最大化利润。

例如,如果价格序列为 `[7,1,5,3,6,4]`,那么最优策略是:在第2 天买入(价格为1),在第5 天卖出(价格为6),总利润为5。

**动态规划解决方案**

我们可以使用动态规划来解决这个问题。假设 `dp[i]` 表示到第 `i` 天结束时的最大利润,我们可以根据以下规则更新 `dp` 数组:

* 如果在第 `i-1` 天没有交易过,则 `dp[i] = dp[i-1]`
* 如果在第 `i-1` 天只进行了一次交易,则 `dp[i] = max(dp[i-1], prices[i] - prices[i-1])`

我们可以使用一个额外的数组 `preMax` 来存储到每个天结束时的最大利润(不超过两次交易)。具体来说,`preMax[i]` 表示到第 `i` 天结束时的最大利润。

**代码实现**

def maxProfit(prices):
 # 初始化动态规划数组和前缀最大值数组 dp = [0] * len(prices)
 preMax = [0] * len(prices)

 # 初始化前缀最大值数组 for i in range(1, len(prices)):
 preMax[i] = max(preMax[i-1], prices[i])

 # 动态规划计算 dp[0] =0 for i in range(1, len(prices)):
 if prices[i] > prices[i-1]:
 dp[i] = dp[i-1] + (prices[i] - prices[i-1])
 else:
 dp[i] = max(dp[i-1], preMax[i])

 # 返回最大利润 return dp[-1]

# 测试用例print(maxProfit([7,1,5,3,6,4])) # 输出:5


**注释**

* `dp` 数组用于存储到每个天结束时的最大利润。
* `preMax` 数组用于存储到每个天结束时的最大利润(不超过两次交易)。
* 在动态规划计算中,我们使用了一个额外的变量 `prices[i] - prices[i-1]` 来表示在第 `i` 天买入和卖出的利润。
* 如果在第 `i-1` 天没有交易过,则 `dp[i] = dp[i-1]`,因为最大利润保持不变。
* 如果在第 `i-1` 天只进行了一次交易,则 `dp[i] = max(dp[i-1], prices[i] - prices[i-1])`,因为我们可以选择在第 `i` 天买入或卖出。

**总结**

本文介绍了动态规划解决股票买卖问题的方法。通过使用额外的数组 `preMax` 和动态规划计算,我们可以有效地求解这个问题。代码实现和注释提供了详细的说明,帮助读者理解算法原理和实现细节。

其他信息

其他资源

Top