lintcode [python]151. 買賣股票的最佳時機 III你最多可以完成兩筆交易。
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。股價與天數有關,不斷選擇最優方案,以求最優解
相關文章
- leetcode 123 買賣股票的最佳時機 IIILeetCode
- 程式碼隨想錄演算法訓練營 | 121.買賣股票的最佳時機,122.買賣股票的最佳時機II,123.買賣股票的最佳時機III演算法
- 買賣股票的最佳時機 IV javaJava
- 陣列筆試題之買賣股票的最佳時機陣列筆試
- 121. 買賣股票的最佳時機
- 42-best-time-to-buy-and-sell-stock-iii 力扣 123. 買賣股票的最佳時機 III力扣
- leetcode 121 買賣股票的最佳時機LeetCode
- 力扣之陣列——買賣股票的最佳時機力扣陣列
- 力扣-121. 買賣股票的最佳時機力扣
- Leetcode121. 買賣股票的最佳時機LeetCode
- leetcode 122 買賣股票的最佳時機 IILeetCode
- 力扣-122. 買賣股票的最佳時機 II力扣
- 程式碼隨想錄演算法訓練營第48天 | 188.買賣股票的最佳時機IV 、309.最佳買賣股票時機含冷凍期、 714.買賣股票的最佳時機含手續費演算法
- 演算法122. 買賣股票的最佳時機 II演算法
- [Leetcode]123.買賣股票的最佳時機3LeetCode
- LeetCode-122-買賣股票的最佳時機 IILeetCode
- LeetCode122. 買賣股票的最佳時機 IILeetCode
- 【演算法】【線性表】【陣列】買賣股票的最佳時機演算法陣列
- LeetCode《買賣股票的最佳時機》系列題目,最詳解LeetCode
- LeetCode-Java:122. 買賣股票的最佳時機ⅡLeetCodeJava
- Day 44 | 714.買賣股票的最佳時機含手續費
- 【演算法】【線性表】【陣列】買賣股票的最佳時機 II演算法陣列
- 演算法系列-動態規劃(4):買賣股票的最佳時機演算法動態規劃
- 線性dp:LeetCode122.買賣股票的最佳時機llLeetCode
- Java演算法之動態規劃詳解-買賣股票最佳時機Java演算法動態規劃
- [力扣每日一題]714. 買賣股票的最佳時機含手續費力扣每日一題
- leetcode 動態規劃 買賣股票的最佳時機含手續費 javaLeetCode動態規劃Java
- leetcode【每日一題】122. 買賣股票的最佳時機 II JavaLeetCode每日一題Java
- LeetCode 188 買賣股票的最佳時機IV HERODING的LeetCode之路LeetCode
- Leetcode121、買賣股票的最佳時機(Python題解)只買一次,位元組跳動面試題LeetCodePython面試題
- 「leetcode」714. 買賣股票的最佳時機含手續費 超詳細講解LeetCode
- 【leetcode】40-best-time-to-buy-and-sell-stock 力扣 121. 買賣股票的最佳時機LeetCode力扣
- C#繪製股票K線圖和量化交易買賣點C#
- 【動態規劃】買賣股票動態規劃
- 個股分時走勢最佳買賣點學習筆記筆記
- 122. 買賣股票的最佳時機 II-簡單-動態規劃、貪心演算法動態規劃演算法
- 44-best-time-to-buy-and-sell-stock-with-cooldown 力扣 309. 買賣股票的最佳時機包含冷凍期力扣
- 演算法之DP——買賣股票演算法