class Solution:
def maxProfit(self, prices: List[int]) -> int:
sell =0
buy =-prices[0]
for p in prices[1:]:
sell =sell if sell>buy+p else buy+p
buy =buy if buy > -p else -p
return sell
动态规划
状态定义
dp[i][j][0/1] 表示第i天 , 最多进行j次交易,是否有股票,的最大利润
状态转移
dp[i][j][0] = max(dp[i-1][j][0],dp[i-1][j][1]+price[i])
前一天没有股票,交易次数不变
前一天有股票选择卖出,交易次数不变
dp[i][j][1] = max(dp[i-1][j][1],dp[i-1][j-1][0]-price[i])
前一天有股票
前一天没有股票选择买入,交易次数减少1
边界条件
天数从第一天开始计算
dp[0][0][0]=0
dp[0][0][1]=0
最后目标
dp[n][k][0]:在第n天 最大交易次数为k时,手中没有股票的最大利润
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
max_tran = 2
dp =[[ [0]*2 for _ in range (max_tran)] for _ in range(n)]
for j in range(max_tran):
dp[0][j][1]=-prices[0]
print(dp)
for i in range(1,n):
for j in range(max_tran-1,-1,-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])
print(dp)
return dp[n-1][1][0]
问题记录
不是边界问题:
交易次数的作用:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
max_tran = 2
dp =[[ [0]*2 for _ in range (max_tran+1)] for _ in range(n)]
for i in range(n):
for j in range(max_tran,0,-1):
if not i:
dp[i][j][0] = 0;
dp[i][j][1] = -prices[i];
continue;
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][max_tran][0]
给dp 交易次数多设置了一位?
如果不多设置一位?