代码随想录算法训练营Day 50 | 动态规划part12 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
文章目录
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 0
dp = [[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 0
dp=[[0]*2 for _ in range(len(prices))]
dp[0][0]=-prices[0]
dp[0][1]=0
for 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])