动态规划——买卖股票的最佳时机含冷冻期

简介: 动态规划——买卖股票的最佳时机含冷冻期

1、题目链接


leetcode 309. 买卖股票的最佳时机含冷冻期



2、题目分析


该题有我们可以定义三种状态,买入状态,可交易状态 ,冷冻期状态

我们可以建立一个n*3的二维数组来表示这三种状态:




根据这个图可以看出,

可以从买入状态卖出变成可交易状态,或者从买入状态还是到买入状态(什么也不干),

可以从可交易状态到买入状态,或者从可交易状态到可交易状态(什么也不干)

可以从冷冻期状态到可交易状态(只有这一种情况)

根据以上信息,可以列出状态转移方程:

dp[i][0]表示在第i天,处于买入状态时所获得的最大利润

dp[i][1]表示在第i天,处于可交易状态时所获得的最大利润

dp[i][2]表示在第i天,处于冷冻期状态时所获得的最大利润


那么:

dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);

dp[i][1]=max(dp[i-1][1],dp[i-1][2]);

dp[i][2]=dp[i-1][0]+prices[i];

3、代码解析

int maxProfit(vector<int>& prices) {
        int n=prices.size();
        vector<vector<int>>dp(n,vector<int>(3));
        //dp[i][0]表示在第i天,处于买入状态时所获得的最大利润
        //dp[i][1]表示在第i天,处于可交易状态时所获得的最大利润
        //dp[i][2]表示在第i天,处于冷冻期状态时所获得的最大利润
 
        //初始化
        dp[0][0]=-prices[0];
        dp[0][1]=0;
        dp[0][2]=0;
        for(int i=1;i<n;i++)
        {
            dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);
            dp[i][1]=max(dp[i-1][1],dp[i-1][2]);
            dp[i][2]=dp[i-1][0]+prices[i];
        }
        return max(dp[n-1][1],dp[n-1][2]);
    }


相关文章
|
缓存 Oracle Java
说一说无锁队列 Disruptor 原理解析
我是小假 期待与你的下一次相遇 ~
340 1
|
IDE NoSQL Java
如何搭建springboot脚手架
本文讲述了项目初始化时常见的环境搭建问题,包括IDE的下载和选择,以及版本管理的复杂性。作者分享了在使用不同版本的SpringBoot和SpringCloud时遇到的版本兼容性问题,强调了版本管理的重要性。文章还提到了Maven在解决依赖关系中的作用,以及介绍了SpringBoot的自动配置功能。此外,文章提供了全局异常处理、日志处理、跨域类和响应体的代码示例,并推荐了一些常用的开发工具,如内存版中间件和Java工具库。最后,作者提到在实际工作中,与他人协作时的环境一致性问题也可能带来困扰。
2191 1
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
1103 1
Java 中数组Array和列表List的转换
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
1264 0
|
开发框架 运维 监控
Spring Boot中的日志框架选择
在Spring Boot开发中,日志管理至关重要。常见的日志框架有Logback、Log4j2、Java Util Logging和Slf4j。选择合适的日志框架需考虑性能、灵活性、社区支持及集成配置。本文以Logback为例,演示了如何记录不同级别的日志消息,并强调合理配置日志框架对提升系统可靠性和开发效率的重要性。
723 5
|
编解码
四、ArkTS 常用组件-图片(Image)
ArkTS 常用组件-图片(Image)简介:Image 组件用于在应用中显示图片,支持本地和网络图片的加载,提供了多种参数类型如 string、Resource 和 media.PixelMap。常用属性包括图片尺寸设置(width()、height())、图片缩放模式(objectFit())及图片插值(interpolation()),确保图片在不同场景下的最佳显示效果。此外,Image 组件还支持图片资源的灵活引用方式,如通过 $r() 函数引用 resources 目录下的图片资源。
1612 2
|
存储 算法 Android开发
【算法基础】拓扑排序及实战
在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个**有向无环图(DAG,Directed Acyclic Graph)**
1689 0
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
14176 4
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
监控 Java 持续交付
如何搭建漂亮的 SpringBoot 脚手架?
【10月更文挑战第1天】在快速迭代的软件开发环境中,一个高效、美观且易于维护的 SpringBoot 脚手架是项目成功的关键。本文将详细介绍如何搭建一个既实用又漂亮的 SpringBoot 脚手架,帮助你在工作和学习中提升开发效率。
2736 0
手把手教会你使用Markdown【从入门到精通一篇就够了】
手把手教会你使用Markdown【从入门到精通一篇就够了】