動機
可以當成188的暖身題
Problem
You are given an array prices
where prices[i]
is the price of a given stock on the ith
day.
Find the maximum profit you can achieve. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times) with the following restrictions:
- After you sell your stock, you cannot buy stock on the next day (i.e., cooldown one day).
Note: You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).
Example 1:
Input: prices = [1,2,3,0,2]Output: 3Explanation: transactions = [buy, sell, cooldown, buy, sell]
Example 2:
Input: prices = [1]Output: 0
Constraints:
1 <= prices.length <= 5000
0 <= prices[i] <= 1000
Sol
把buy與sell分開,要算出在買與賣之間的最大收益
buy[i] = sell[i-1] - prices[i] | buy[i-1]
sell[i] = buy[i-1] + prices[i] | sell[i-1]
但這是看前一天的,現在賣完要慢一天才能買,所以改成
buy[i] = sell[i-2] - prices[i] | buy[i-1]
sell[i] = buy[i-1] + prices[i] | sell[i-1]
class Solution:
@functools.cache
def buy(self,i):
if i < 0:
return 0
elif i == 0:
return -self.prices[i]
else:
return max(self.sell(i-2)-self.prices[i], self.buy(i-1))
@functools.cache
def sell(self,i):
if i <= 0:
return 0
else:
return max(self.buy(i-1)+self.prices[i],self.sell(i-1))
def maxProfit(self, prices: List[int]) -> int:
# buy[i] = sell[i-1] - prices[i] | buy[i-1]
# sell[i] = buy[i-1] + prices[i] | sell[i-1]
# buy must be delayed, which has cooldown before sell
# take sell[i-2] when do buy
self.prices = prices
return self.sell(len(prices)-1)