class Solution:def maxProfit(self, prices: List[int]) -> int:sell =0buy =-prices[0]for p in prices[1:]:sell =sell if sell>buy+p else buy+pbuy =buy if buy > -p else -preturn 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 = 2dp =[[ [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 = 2dp =[[ [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 交易次数多设置了一位?
如果不多设置一位?
