今天的还是dp,但是相对来说dp的递推公式开始复杂了
121. Best Time to Buy and Sell Stock
这道题如果不用dp用贪心算法也可以,贪心的点在于遍历过程中,每次找最小的,然后用当前的减最小的从而得出最大利益.但是这道题看到的第一反应还是要用dp
首先需要两个dp, 一个是buy状态的一个是hold状态的.他们分别代表到i为止采取上述操作,能获得的最大利益. 递推公式就是两个状态的相互转换,而且要同时计算,不能有先后顺序.对于buy来说取上次buy和当前次-price[i]的最大值,因为只要买就需要花钱
初值的话如果是hold则为0,如果是buy则为-prices[0],因为对于当前来说,前一次是花了钱的
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp_buy=[0 for _ in range(len(prices))]
dp_hold=[0 for _ in range(len(prices))]
dp_buy[0]=-prices[0]
dp_hold[0]=0
for i in range(1,len(prices)):
dp_buy[i],dp_hold[i]=max(dp_buy[i-1],-prices[i]),max(dp_hold[i-1],dp_buy[i-1]+prices[i])
return dp_hold[-1]
122. Best Time to Buy and Sell Stock II
这道题和上一道题很像,区别在于递推公式.对于buy来说,需要两种情况取最大,一种是上一次的情况.还有就是上一次是hold的情况.需要用上一次hold的情况减去当前的价格,因为买次最多只能持一股. hold和之前类似
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp_buy=[0 for _ in range(len(prices))]
dp_hold=[0 for _ in range(len(prices))]
dp_buy[0]=-prices[0]
dp_hold[0]=0
for i in range(1,len(prices)):
dp_buy[i],dp_hold[i]=max(dp_buy[i-1],dp_hold[i-1]-prices[i]),max(dp_hold[i-1],dp_buy[i-1]+prices[i])
return dp_hold[-1]