📅  最后修改于: 2023-12-03 15:06:40.421000             🧑  作者: Mango
这个题目是一个典型的动态规划问题。
给定一个数组表示股票每日价格,每次买入或卖出股票都需要支付 fee
的交易费用,计算在交易完成后所能获得的最大利润。
我们可以通过动态规划来解决这个问题。假设我们当前拥有的资金为 cash
,持有股票的价值为 stock
,那么我们可以用以下状态表示我们当前的情况:
cash
表示目前手上的现金数;stock
表示目前手上持有的股票数;is_buy
表示当前是否持有股票,其中 0 表示没有持有,1 表示持有。则我们可以得到以下状态转移方程:
dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]-fee) # 在第 i 天卖出股票
dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i]) # 在第 i 天买入股票
其中 dp[i][0]
表示在第 i
天手上没有股票的最大利润,dp[i][1]
表示在第 i
天手上持有股票的最大利润。
我们可以通过迭代 i
的方式,得到最后的 dp[n-1][0]
,即在最后一天手上没有股票的最大利润。
以下是 python 的动态规划实现:
def maxProfit(prices: List[int], fee: int) -> int:
n = len(prices)
dp = [[0, 0] for _ in range(n)]
dp[0][0], dp[0][1] = 0, -prices[0]
for i in range(1, n):
dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]-fee)
dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i])
return dp[n-1][0]
本题目采用了动态规划的思想,通过对每天持有或不持有股票的最佳状态进行更新,最终得出了可以获得最大利润的方案。这种思路同样可以运用到其他股票价格类似的问题中。