leetcode_309

Best Time to Buy and Sell Stock with Cooldown

题目戳这

题意

给定一个数组,数组中的每个元素代表某一天股票的价格,你可以买入一只股票然后卖出,当然这个在卖出前一定要买入,而且同一天之内只能买入或者卖出,当卖出以后至少得休息一天,问这样安排下能够收获的最大利益。

解法

动态规划。我们用buy[i]代表第i天买入时能够得到的最大收益,sell[i]代表第i天卖出时能够得到的最大收益。则

buy[i] = max(buy[i-1], sell[i-2]-prices[i]) # 注意限制,休息一天

sell[i] = max(sell[i-1], buy[i-1]+prices[i]) # 第一天买入,第二天可以卖出

得到状态转移方程以后就好写了。。dp就是这么简单粗暴(我指的是代码简单,,想法不简单Orz…)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if not prices:
return 0
sell = [0]*10010
buy = [0]*10010
buy[0] = -prices[0] # 第一天买入
sell[0] = 0
mmax = 0
for i in range(1,len(prices)):
# delta = prices[i] - prices[i-1]
sell[i] = max(buy[i-1]+prices[i], sell[i-1])
buy[i] = max(sell[i-2]-prices[i], buy[i-1])
mmax = max(mmax,sell[i])
return mmax
# if not prices:
# return 0
# sell,buy,prev_sell,prev_buy = 0,-prices[0],0,0
# for i in range(1,len(prices)):
# prev_buy = buy
# buy = max(prev_sell-prices[i], prev_buy)
# prev_sell = sell
# sell = max(prev_buy+prices[i], prev_sell)
# return sell