leetcode 123 股票利润3

动态规划,分析会产生几种状态。
哪天的股票,当天是否持有,当天已经买卖过几次,是否持有股票分两种情况,持有还是不持有;已经买卖过几次,分三种,因为题目要求至多2次买卖,分别是0次,1次,2次。
也就是组合出来每天有6种情况。
然后分别分析这六种情况的状态转移。
dp[i][0][0]=dp[i-1][0][0]# 没持有,也没卖
dp[i][0][1]=max(dp[i-1][0][1],dp[i-1][1][0]+prices[i])#当前没有持有,但是已经买卖过一次,那就有可能是今天卖的第一次,要么是已经就已经卖过第一次了
dp[i][0][2]=max(dp[i-1][0][2],dp[i-1][1][1]+prices[i])#当前没持有,但是买卖过两次,要么是之前就买卖过两次,要么是之前持有且买卖过一次
dp[i][1][0]=max(dp[i-1][1][0],dp[i-1][0][0]-prices[i])#当前持有,没有买卖过,要么之前就持有,要么之前没持有才买入
dp[i][1][1]=max(dp[i-1][1][1],dp[i-1][0][1]-prices[i])#当前持有,同时买卖过一次,要么之前也是这个状态,要么是刚刚买入
dp[i][1][2]=float('-inf')不存在值

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        dp=[[[0,0,0],[0,0,0]] for _ in range(len(prices))]
        dp[0][0][0]=0
        dp[0][1][0]=-prices[0]
        dp[0][0][1]=float('-inf')
        dp[0][0][2]=float('-inf')
        dp[0][1][1]=float('-inf')
        dp[0][1][2]=float('-inf')


        for i in range(1,len(prices)):
            dp[i][0][0]=0
            dp[i][0][1]=max(dp[i-1][1][0]+prices[i],dp[i-1][0][1])
            dp[i][0][2]=max(dp[i-1][1][1]+prices[i],dp[i-1][0][2])
            dp[i][1][0]=max(dp[i-1][0][0]-prices[i],dp[i-1][1][0])
            dp[i][1][1]=max(dp[i-1][0][1]-prices[i],dp[i-1][1][1])
            dp[i][1][2]=float('-inf')
        #
        return max(dp[len(prices)-1][0][2],dp[len(prices)-1][0][1],0)

把它看作四个状态,buy1,buy2,sell1,sell2,将这四种状态进行转移。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:      

        buy1,buy2,sell1,sell2=-prices[0],-prices[0],0,0
        for i in range(1,len(prices)):

            buy1=max(-prices[i],buy1)
            sell1=max(buy1+prices[i],sell1)
            buy2=max(sell1-prices[i],buy2)
            sell2=max(buy2+prices[i],sell2)

        return max(sell1,sell2)
动态规划 文章被收录于专栏

给自己归纳复习的一些做过的题目,写得很乱,大家可以按照这个题目去针对性做题,确实会有提升!

全部评论

相关推荐

ming_ri:“很抱歉,您的简历和我们当前的职位需求不是很匹配”
点赞 评论 收藏
分享
小厂面经,也是我的处女面(30min)1.自我介绍2.spring boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务