题目:给定一个数组,它的第 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)
ttt