题目一
题目特点:只买卖一次
dp[i][0] 表示第i天持有股票所得最多现金 ,其实一开始现金是0,那么加入第i天买入股票现金就是 -prices[i], 这是一个负数。
dp[i][1] 表示第i天不持有股票所得最多现金
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
dp = [[0]* 2 for _ in range(len(prices))]
dp[0][0] = 0 - prices[0]
dp[0][1] = 0
#只买卖一次,0-price[i]
for i in range(1,len(prices)):
dp[i][0] = max(dp[i-1][0],0-prices[i])
dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i])
#返回最后不持有的数值
return dp[-1][1]
题目二:
题目特点:可以买卖多次
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
dp = [[0]* 2 for _ in range(len(prices))]
dp[0][0] = 0 - prices[0]
dp[0][1] = 0
#可以买卖多次,持有的现金可以由dp[i-1][1]-prices[i]推出
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])
return dp[-1][1]
题目三
至多两笔交易
四种状态
- 第一次持有股票
- 第一次不持有股票
- 第二次持有股票
- 第二次不持有股票
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
dp = [[0]* 4 for _ in range(len(prices))]
dp[0][0] = 0 - prices[0]
dp[0][1] = 0
dp[0][2] = 0 - prices[0]
dp[0][3] = 0
for i in range(1,len(prices)):
dp[i][0] = max(dp[i-1][0],0-prices[i])
dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i])
dp[i][2] = max(dp[i-1][2],dp[i-1][1]-prices[i])
dp[i][3] = max(dp[i-1][3],dp[i-1][2]+prices[i])
return max(dp[-1][1],dp[-1][3])
第四题
上一题的进阶版,这个题目需有2k+1个状态(因为要有第二层循环,为了写法统一,需要有表示不操作的维度)
所有奇数项的初始化都为-price[0],公式根据定义注意推导
- 0 表示不操作
- 1 第一次买入
- 2 第一次卖出
- 3 第二次买入
- 4 第二次卖出
- .....
class Solution(object):
def maxProfit(self, k, prices):
"""
:type k: int
:type prices: List[int]
:rtype: int
"""
dp = [[0] * (2*k+1) for _ in range(len(prices))]
for j in range(0,2*k-1,2):
dp[0][j+1] = -prices[0]
for i in range(1,len(dp)):
for j in range(0,2*k-1,2):
dp[i][j+1] = max(dp[i-1][j+1],dp[i-1][j] - prices[i])
dp[i][j+2] = max(dp[i-1][j+2],dp[i-1][j+1] + prices[i])
return dp[-1][-1]
第五题
- 状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
- 不持有股票状态,这里就有两种卖出股票状态
- 状态二:保持卖出股票的状态(冷冻期之后到下次买入之间)
- 状态三:今天卖出股票
- 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
dp = [[0]*4 for _ in range(len(prices))]
dp[0][0] = -prices[0]
for i in range(1,len(dp)):
#分为冷冻期之后直接买,还有冷冻期过了之后再买
dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i],dp[i-1][3]-prices[i]) #持有
dp[i][1] = max(dp[i-1][1],dp[i-1][3]) #冷冻期之后的持有
dp[i][2] = dp[i-1][0]+prices[i] #卖出
dp[i][3] = dp[i-1][2] #冷冻期
return max(dp[-1][1],dp[-1][2],dp[-1][3])
第六题
类似题目二
class Solution(object):
def maxProfit(self, prices, fee):
"""
:type prices: List[int]
:type fee: int
:rtype: int
"""
dp = [[0] * 2 for _ in range(len(prices))]
dp[0][0] = -prices[0]
dp[0][1] = 0
for i in range(1,len(dp)):
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])