题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode)
思路:dp[i][0] 表示第i天持有股票所得的最多现金
dp[i][1] 表示第i天卖出股票所得的最多现金
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
size = len(prices)
if size == 0:
return 0
dp = [[0] * 2 for _ in range(size)] #dp[i][0] 表示第i天持有股票所得最多现金; dp[i][1] 表示第i天不持有股票所得最多先进
dp[0][0] -= prices[0]
dp[0][1] = 0
for i in range(1, size):
dp[i][0] = max(dp[i - 1][0], -prices[i]) #选用一个进价最低的
dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]) #要么留有该股票 要么在今天卖出
return dp[size - 1][1]
题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)
思路:与 122 不同之处在于股票可以购买多次,买股票的时候需要加上之前的利润
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
size = len(prices)
dp = [[0] * 2 for _ in range(size)]
dp[0][0] -= prices[0]
dp[0][1] = 0
for i in range(1, size):
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[size - 1][1]
题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode)
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if len(prices) == 0:
return 0
dp = [[0] * 5 for _ in range(len(prices))]
dp[0][1] = -prices[0]
dp[0][3] = -prices[0]
# 0. 没有操作
# 1. 第一次持有股票
# 2. 第一次不持有股票
# 3. 第二次持有股票
# 4. 第二次不持有股票
for i in range(1, len(prices)):
dp[i][0] = dp[i-1][0]
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])
dp[i][4] = max(dp[i-1][4], dp[i-1][3] + prices[i])
return dp[-1][4]