from typing import List# 用動態規劃的寫法來寫題。# 每一天都有五種情況發生,#1,今天買入,2,今天賣出,3今天是冷凍期,4,今天不買入也不賣出(沒有持有股票)5,今天不買入也不賣出(持有股票)class Solution: def maxProfit(self, pric ...
from typing import List
# 用動態規劃的寫法來寫題。
# 每一天都有五種情況發生,
#1,今天買入,2,今天賣出,3今天是冷凍期,4,今天不買入也不賣出(沒有持有股票)5,今天不買入也不賣出(持有股票)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
# 當天數小於二時,無法進行買賣交易,因此直接返回零
if len(prices) <= 1:return 0
# 定義列表表示狀態方程
dp = [[0,0,0,0,0] for _ in range(len(prices)) ]
# 定義初始值的狀態
# 今天買入的利潤為負值
dp[0][0] = -prices[0]
# 第一天不可能賣出
dp[0][1] = float("-inf")
# 第一天不可能處於冷凍期
dp[0][2] = float("-inf")
# 不進行交易利潤為零
dp[0][3] = 0
# 第一天不可能持有股票,同時不交易
dp[0][4] = float("-inf")
# 進行遍歷
for index in range(1,len(prices)):
# 今天買入,昨天可能是冷凍期,或者沒有交易
dp[index][0] = max(dp[index - 1][3],dp[index - 1][2]) - prices[index]
# 今天賣出,可能是昨天買入的,也可能是昨天已經持有但沒有交易
dp[index][1] = max(dp[index - 1][0],dp[index - 1][4]) + prices[index]
# 今天為冷凍期代表昨天賣出
dp[index][2] = dp[index - 1][1]
#今天不交易,昨天可能是冷凍期,或者昨天就不交易
dp[index][3] = max(dp[index -1][3],dp[index - 1][2])
# 今天不交易(但持有股票),可能是昨天就沒有交易同時持有股票,也可能是昨天剛買的股票。
dp[index][4] = max(dp[index - 1][4],dp[index - 1][0])
return max(dp[-1])
A = Solution()
print(A.maxProfit([1,2,3,0,2]))