leecode:最佳买卖股票时机含冷冻期(python)

1. 题目描述

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例:

输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

2. 思路(动态规划)

leecode:最佳买卖股票时机含冷冻期(python)_第1张图片
leecode:最佳买卖股票时机含冷冻期(python)_第2张图片

2.1 python代码

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if len(prices) <= 1:
            return 0
        n = len(prices)
        dp = [[0 for i in range(2)] for j in range(n)]
        dp[0][0] = 0
        dp[0][1] = -prices[0]
        dp[1][0] = max(0,prices[1]-prices[0])
        dp[1][1] = max(-prices[0],-prices[1])
        for i in range(2,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-2][0]-prices[i])
        return dp[n-1][0]
优化
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if len(prices) <= 1:
            return 0
        n = len(prices)
        dp_cur_0 = 0
        dp_cur_1 = -prices[0]
        dp_pre_0 = 0
        for i in range(1,n):
            temp = dp_cur_0  
            # 状态转移过程中,涉及到前天的只有前天不持有股票的按情况,
            # 定义一个temp变量,来表示当前天的前天,并不断更新
            dp_cur_0 = max(dp_cur_0,dp_cur_1 + prices[i])
            dp_cur_1 = max(dp_cur_1,dp_pre_0 - prices[i])
            dp_pre_0 = temp
        return dp_cur_0

你可能感兴趣的:(leetcode)