代码随想录算法训练营Day 50 | 动态规划part12 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
文章目录
- 代码随想录算法训练营Day 50 | 动态规划part12 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
- 309.最佳买卖股票时机含冷冻期
- 一、两种状态
- 二、3种状态
- 714.买卖股票的最佳时机含手续费
- 一、与买卖股票的最佳时机II相同思路
309.最佳买卖股票时机含冷冻期
题目链接
一、两种状态
class Solution(object):def maxProfit(self, prices):""":type prices: List[int]:rtype: int"""# dp[i][0], 第i天【持有股票】所得的最大利润# dp[i][1], 第i天【不持有股票】所得的最大利润if len(prices)<2:return 0dp = [[0]*2 for _ in range(len(prices))]dp[0][0] = -prices[0] # 第1天买入dp[1][0] = max(-prices[0],-prices[1]) # 第2天买入或持有dp[0][1] = 0 # 第1天不持有dp[1][1] = max(0,prices[1]-prices[0]) # 第二天不持有for i in range(2,len(prices)):dp[i][0]=max(dp[i-1][0],dp[i-2][1]-prices[i])dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i])return dp[-1][1]
二、3种状态
class Solution:def maxProfit(self, prices: List[int]) -> int:n = len(prices)if n < 2:return 0# 定义三种状态的动态规划数组dp = [[0] * 3 for _ in range(n)]dp[0][0] = -prices[0] # 持有股票的最大利润dp[0][1] = 0 # 不持有股票,且处于冷冻期的最大利润dp[0][2] = 0 # 不持有股票,不处于冷冻期的最大利润for i in range(1, n):# 当前持有股票的最大利润等于前一天持有股票的最大利润或者前一天不持有股票且不处于冷冻期的最大利润减去当前股票的价格dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i])# 当前不持有股票且处于冷冻期的最大利润等于前一天持有股票的最大利润加上当前股票的价格dp[i][1] = dp[i-1][0] + prices[i]# 当前不持有股票且不处于冷冻期的最大利润等于前一天不持有股票的最大利润或者前一天处于冷冻期的最大利润dp[i][2] = max(dp[i-1][2], dp[i-1][1])# 返回最后一天不持有股票的最大利润return max(dp[-1][1], dp[-1][2])
714.买卖股票的最佳时机含手续费
题目链接
一、与买卖股票的最佳时机II相同思路
class Solution(object):def maxProfit(self, prices, fee):""":type prices: List[int]:type fee: int:rtype: int"""if len(prices)==0:return 0dp=[[0]*2 for _ in range(len(prices))]dp[0][0]=-prices[0]dp[0][1]=0for i in range(1,len(prices)):dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i])dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]-fee)return max(dp[-1][0],dp[-1][1])