步骤一、确定状态:
确定dp数组及下标含义 dp[i]是一个长度为len(prices)的一维数组,表示的是在第i天持有股票
步骤二、推断状态方程:
第i天持有股票,即dp[i][1], 那么两个状态:
1、第i-1天就持有股票, 保持现状过来的, 最大利润就是昨天持有股票的最 大利润dp[i-1][1]
2、第i-1天没有股票,第i天刚买进来的, 那这时候的最大利润就是dp[i- 1][0]-prices[i],注意这个不是仅仅的-prices[i]了, 因为此时可以进行多次 交易了, 即使第i-1没有股票,那么也可能会有更前面的利润传过来,dp[i][1] 选择最大的: dp[i][1]=max(dp[i-1][1], dp[i-1][0]-prices[i])
步骤四、计算顺序:
从左往右, 从1开始遍历,返回的是最后没有股票时候的最大利润, 也就是dp[-1][0]
class Solution:
def maxProfit(self, prices: List[int]) -> int:
# 异常值判断
if len(prices) < 2:
return 0
# dp数组定义
dp = [[0,0] for _ in range(len(prices))]
# dp初始化
dp[0][0] = 0
dp[0][1] = -prices[0]
for i in range(1, len(prices)):
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]) # 第i天不持有股票
dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i]) # 第i天持有股票
return dp[-1][0]