Bootstrap

106. Leetcode 122. 买卖股票的最佳时机 II (动态规划-股票交易)

 

步骤一、确定状态:

确定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]

;