lintcode [python]151. 買賣股票的最佳時機 III你最多可以完成兩筆交易。

vix1024發表於2020-11-24

151. 買賣股票的最佳時機 III

假設你有一個陣列,它的第i個元素是一支給定的股票在第i天的價格。設計一個演算法來找到最大的利潤。你最多可以完成兩筆交易。

Code

def maxProfit(self, prices):
    # write your code here
    if prices is None or len(prices)==0:
        return 0
    n=len(prices)
    dp=[[0]*(5+1) for _ in range(n+1)]
    
    dp[0][1]=0
    dp[0][2]=dp[0][3]=dp[0][4]=dp[0][5]=float('-inf')
    for i in range(1,n+1,1):
        for j in range(1,5+1,2):#1,3,5
            dp[i][j]=dp[i-1][j]#昨天沒有持有今天還沒有
            if j>1 and i>1 and dp[i-1][j-1] != float('-inf'):#昨天持有但今天賣出
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+prices[i-1]-prices[i-2])                
        for j in range(2,5+1,2):#2,4
            dp[i][j]=dp[i-1][j-1]#昨天未持有今天買入
            if i>1 and dp[i-1][j] != float('-inf'):#昨天持有並且今天依然持有
                dp[i][j]=max(dp[i][j],dp[i-1][j]+prices[i-1]-prices[i-2])
            if j>2 and i>1 and dp[i-1][j-2] != float('-inf'):#昨天持有今天賣出並買入
                dp[i][j]=max(dp[i][j],dp[i-1][j-2]+prices[i-1]-prices[i-2])
    
    
    return max(max(dp[n][1],dp[n][3]),dp[n][5])

想法:

1.分為5個狀態,第一次買之前,持有,第一次買之後第一次買之前,持有,第二次賣。
2.j表示狀態
3.分持有(2,4)與不持有(1,3,5)兩種
不持有狀態下:存在昨天沒有持有今天還沒有與昨天持有但今天賣出
持有:分為昨天持有並且今天依然持有,昨天未持有今天買入,昨天持有今天賣出並買入。
買入賣出再買再賣無意義
4. if i>1 and dp[i-1][j] != float(’-inf’):之所以不需要j>2因為他需要上一狀態的結果。
5. return max(max(dp[n][1],dp[n][3]),dp[n][5])
表示空倉,買賣1次,買賣2次
6。股價與天數有關,不斷選擇最優方案,以求最優解

相關文章