没看答案,可以交易无数次,但每次买入或卖出都需要支付手续费。
labuladong版(超时)
import sys
class Solution:
def maxProfit(self, prices: List[int], fee: int) -> int:
n = k = len(prices)
dp = [[[0] * 2 for _ in range(k+1)] for _ in range(n)]
for i in range(n):
dp[i][0][0] = 0
dp[i][0][1] = -sys.maxsize
for j in range(k+1):
dp[-1][j][0] = 0
dp[-1][j][1] = -sys.maxsize
for i in range(n):
for j in range(1, k+1):
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] - fee)
return dp[n-1][k][0]
简化版(省略k)
- 买入付手续费
class Solution:
def maxProfit(self, prices: List[int], fee: int) -> int:
n = len(prices)
dp = [[0] * 2 for _ in range(n)]
dp[0][0] = 0
dp[0][1] = -prices[0] - fee
for i in range(1, n):
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] - fee)
return dp[n-1][0]
- 卖出付手续费
class Solution:
def maxProfit(self, prices: List[int], fee: int) -> int:
n = len(prices)
dp = [[0] * 2 for _ in range(n)]
dp[0][0] = 0
dp[0][1] = -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]