123买卖股票的最佳时机III

题目:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii

法一:参考别人自己写的代码

思路:动态规划,首先题中有两个变量,股票在第几天卖出和卖出的次数,dp[i][j]表示第i天卖出j次股票后的最大利润,状态转移方程:a = max([prices[row] - prices[j] + dp[j][col-1] for j in range(0,row)],从中仔细观察可以看出,- prices[j] + dp[j][col-1] d会被多次重复计算,所以为了减少计算次数,可以把原状态转移方程进行变形,将求最大值转换为求最小值,之所以可以这样转换,原因是分清状态转移方程中的动态量和静态量,由于prices[row]不受变量j的影响,所以是静态量,而后面两个受j的影响,所以是动态量,可以保存其最小值。

from typing import List
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        size = len(prices)
        # 特判
        if size <= 1:
            return 0
        # dp[i][j]表示第i天进行j次卖出后的最大获利
        dp = [[0] * 3 for _ in range(size)]
        print(dp)
        for col in range(1,3):
            # dp[0][1]表示第1天卖出1次,显然为0,所以用默认值,
            # dp[0][2]也是0,
            # 有可能是负值,所以和0进行比较
            dp[1][col] = max(0,prices[1] - prices[0])
            k = prices[0] - dp[0][col-1]
            for row in range(2,size):
                # 由于有大量重复计算,所以每次只需计算k即可,这样很省时间
                k = min(k, prices[row-1] - dp[row-1][col-1])
                a = prices[row] - k
                # # 计算a的时候,有大量重复的计算,
                # a = max([prices[row] - prices[j] + dp[j][col-1] for j in range(0,row)])
                dp[row][col] = max(dp[row-1][col], a)
        print(dp)
        return max(dp[-1][-1],0)
if __name__ == "__main__":
    # prices = [3,3,5,0,0,3,1,4]
    # prices = [3,3,5,0,0,3,1,4]
    # prices = [3,2,5,0,0,3,1,4]
    prices = [1,2]
    # prices = [2,1,4]
    max_profit = Solution().maxProfit(prices)
    print(max_profit)
View Code

ttt

 

posted on 2020-02-18 19:22  吃我一枪  阅读(198)  评论(0编辑  收藏  举报

导航