トピック
整数配列が与えられると、i番目の要素はi番目の日の株価を表します。
最大利益を計算するアルゴリズムを設計します。次の制約の下で、できるだけ多くのトランザクションを完了することができます(株式を複数回売買する)。
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
例:
入力:[1,2,3,0,2]出力:3説明:対応するトランザクションステータスは次のとおりです:[購入、販売、凍結期間、購入、販売]
問題解決のアイデア
動的計画法
状態の定義
Buy [i]はi日に株式を保有することの最大利益を表し、sell [i]はi日に株式を保有しないことの最大利益を表します。
状態遷移方程式
凍結期間をスキップする必要がある場合、株式を保有するi日目に、
最初の2日間は株式を保有しない状況を考慮する必要があります。最初の2日間の定義は
buy[0] ,buy[1]= -prices[0],max(-prices[1],-prices[0])
sell[0],sell[1] = 0,max(prices[1]-prices[0],0)
次の式です。
buy[i] = max(buy[i-1],sell[i-2]-prices[i])
sell[i] = max(sell[i-1],buy[i-1]+prices[i])
コード
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if not prices or prices == sorted(prices,reverse=True):
return 0
buy = [0 for _ in range(len(prices))]
sell = [0 for _ in range(len(prices))]
buy[0] ,buy[1]= -prices[0],max(-prices[1],-prices[0])
sell[0],sell[1] = 0,max(prices[1]-prices[0],0)
for i in range(2,len(prices)):
buy[i] = max(buy[i-1],sell[i-2]-prices[i])
sell[i] = max(sell[i-1],buy[i-1]+prices[i])
return max(sell)