第四十九天|dp

今天的还是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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值