力扣309. 买卖股票的最佳时机含冷冻期(动态规划,Java C++解法)

news2025/1/10 11:10:09

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

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述在这里插入图片描述

思路

Problem: 714. 买卖股票的最佳时机含手续费
该题目可以看作是上述题目的改编,该题目添加了一个冷冻期使得动态转移方程更加复杂,具体思路如下:
1.构建多阶段决策模型:

n天对应n个阶段,每个阶段决策:买股票、卖股票、不操作
买股票:前一天不持有股票,并且处于冷冻期或者处于非冷冻期,而不是刚刚昨天卖掉股票
卖股票:当前持有股票
不操作无规则

2.定义状态:每天都有两种状态:持有股票、不持有股票。不持有股票又分为三小种情况。

int dp[n][4]表示n天的状态
dp[i][0]表示第i天持有股票时的利润
dp[i][1]表示第i天不持有股票时的利润(当天卖掉)
dp[i][2]表示第i天不持有股票时的利润(冷冻期),昨天刚卖掉了股票
dp[i][1]表示第i天不持有股票时的利润(非冷冻期),昨天也没持有

3.定义状态转移方程:

dp[i][0] = max3(dp[i - 1][0], dp[i - 1][2] - prices[i], dp[i - 1][3] - prices[i]);
dp[i][1] = dp[i - 1][0] + prices[i];
dp[i][2] = dp[i - 1][1];
dp[i][3] = Math.max(dp[i - 1][2], dp[i - 1][3]);

解题方法

1.获取prices数组的长度(假设为n),定义数组int[][] dp = new int[n][4];
2.初始化dp数组的第一行:dp[0][0] = -prices[0];dp[0][1] = 0;dp[0][2] = 0;dp[0][3] = 0;
3.从第一行开始完成动态转移方程;
4.返回dp数组的最后一行的最大值

复杂度

时间复杂度:

O ( n ) O(n) O(n);其中 n n n为数组prices的大小

空间复杂度:

O ( n ) O(n) O(n)

Code

class Solution {
   /**
     * Dynamic programming
     * @param prices Given array(Recode the amount of each stock)
     * @return int
     */
    public int maxProfit(int[] prices) {
        int n = prices.length;
        if (n == 1) {
            return 0;
        }
        int[][] dp = new int[n][4];
        /**
         * dp[i][0] represents the profit from holding the stock on day i
         * dp[i][1] represents the profit not held on day i (just sold on the day)
         * dp[i][2] represents the profit from not holding the stock on day i (the freeze period),
         * which was sold yesterday
         * dp[i][3] represents the profit from not holding the stock on day i
         * (non-freezing period) and not holding it yesterday
         */
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        dp[0][2] = 0;
        dp[0][3] = 0;
        //Dynamic transfer
        for (int i = 1; i < n; ++i) {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][2] - prices[i], dp[i - 1][3] - prices[i]);
            dp[i][1] = dp[i - 1][0] + prices[i];
            dp[i][2] = dp[i - 1][1];
            dp[i][3] = Math.max(dp[i - 1][2], dp[i - 1][3]);
        }
        return max(dp[n - 1][0], dp[n - 1][1], dp[n - 1][2], dp[n - 1][3]);
    }

    /**
     * Returns the largest number in a set of numbers
     * @param nums Given numbers 
     * @return int
     */
    private int max(int... nums) {
        int max = Integer.MIN_VALUE;
        for (int num : nums) {
            if (num > max) {
                max = num;
            }
        }
        return max;
    }
}
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 1) {
            return 0;
        }
        vector<vector<int>> dp(n, vector<int>(4));
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        dp[0][2] = 0;
        dp[0][3] = 0;
        for (int i = 1; i < n; ++i) {
            dp[i][0] = ::std::max(dp[i - 1][0], ::std::max(dp[i - 1][2] - prices[i], dp[i - 1][3] - prices[i]));
            dp[i][1] = dp[i - 1][0] + prices[i];
            dp[i][2] = dp[i - 1][1];
            dp[i][3] = ::std::max(dp[i - 1][2], dp[i - 1][3]);
        }
        return ::std::max({dp[n - 1][0], dp[n - 1][1], dp[n - 1][2], dp[n - 1][3]});
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1394495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kylin 安装novnc 远程访问

noVNC可以使用浏览器直接访问服务器&#xff0c;而不需要使用VNC客户端。 1.初始环境 关闭防火墙或允许IP访问本机 2.安装依赖 dnf install -y tigervnc-server git 3.git下载novnc git clone https://github.com/novnc/noVNC.git git clone https://gitee.com/yangyizhao…

吴恩达-从人类反馈中进行强化学习RLHF

吴恩达-从人类反馈中进行强化学习RLHF https://www.bilibili.com/video/BV1R94y1P7QX?p1&vd_sourcee7939b5cb7bc219a05ee9941cd297ade 1、公开的LLM&#xff0c;Llama2&#xff0c; 使用LLM对同一个提示产生多个不同输出&#xff0c;然后人类评估这些输出。评估方法是对比…

线程进阶(以解决线程安全问题为主)、volatile的底层实现

线程&#xff1a;以解决线程安全问题为主 进程&#xff1a;运行时程序&#xff0c;操作系统分配内存资源的最小单位。 线程 &#xff1a;进程内部最小执行单元。 多线程的优点&#xff1a;提高程序响应速度&#xff0c;可以多个线程各自完成自己的工作&#xff0c;提高设备利…

深入理解MyBatis缓存机制:一级缓存与二级缓存详解

深入理解MyBatis缓存机制&#xff1a;一级缓存与二级缓存详解 MyBatis作为一款优秀的持久层框架&#xff0c;其缓存机制是其核心功能之一。在MyBatis中&#xff0c;我们通常会遇到一级缓存和二级缓存&#xff0c;它们分别在不同的场景中发挥着重要作用。本文将深入探讨一级缓存…

鸿蒙不兼容安卓!正式迈入“完全自主研发”阶段,余承东最新发声!

2019年8月9日&#xff0c;华为鸿蒙“备胎”的一夜转正&#xff0c;四年多后的今天&#xff08;1月18日&#xff09;&#xff0c;华为鸿蒙再度令各界惊喜&#xff0c;因为在这一天&#xff0c;华为正式推出了完全自主研发的鸿蒙版本&#xff1a;HarmonyOS NEXT鸿蒙星河版&#x…

IMX6LL|时钟控制

一.时钟控制模块 4个层次配置芯片时钟 晶振时钟PLL与PFD时钟PLL选择时钟根时钟/外设时钟 1.1晶振时钟 系统时钟来源 RTC时钟源&#xff1a;32.768KHz&#xff0c;连接RTC模块&#xff0c;进行时间计算。系统时钟&#xff1a;24MHz&#xff0c;芯片主晶振 1.2PLL和PFD倍频时钟…

MySQL进阶45讲【2】日志系统:一条SQL更新语句是如何执行的?

1 前言 上篇文章我们系统了解了一个查询语句的执行流程&#xff0c;并介绍了执行过程中涉及的处理模块。相信大家还记得&#xff0c;一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块&#xff0c;最后到达存储引擎。 那么&#xff0c;一条更新语句…

【Nuxt3】目录中components文件夹的用法

简言 在Nuxt3中&#xff0c;components文件夹和vue文件夹用处一样&#xff0c;都是放置vue公共组件的地方。只不过由于Nuxt3中components文件内的组件自动导入机制&#xff0c;用法些许不同。 components components/ 目录是你放置所有 Vue 组件的地方。 Nuxt 会自动导入该目…

刷题 ------ 双指针

文章目录 1.验证回文串 ||2.计数二进制字串3. 字符的最短距离4.按奇偶排序数组5.仅仅反转字母6. 奇偶排序数组 ||7.长按键入8. 递减字符匹配9.有序数组的平方10.复写零11.删除回文子序列12.检查单词是否为剧中其他单词的前缀13.交替合并的字符串14.反转单词前缀15.找出数组中的…

阿赵UE学习笔记——11、地形系统

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的用法&#xff0c;这次来学习一下虚幻引擎的地形系统的用法。 一、创建地形 在选项模式里面&#xff0c;选择地形&#xff1a; 进入到地形界面之后&#xff0c;需要先创建一个地形&#xff1a; 留意看…

npm依赖库备份

常用命令 设置默认使用本地缓存安装Nodejs时会自动安装npm&#xff0c;但是局路径是C:\Users\Caffrey\AppData\Roaming\npm默认的缓存路径是C:\Users\Caffrey\AppData\Roaming\npm-cache&#xff1b;查看npm的prefix和cache路径配置信息设置路径 设置默认使用本地缓存 npm con…

李沐《动手学深度学习》线性神经网络 softmax回归

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 目录 系列文章一、softmax回归&#xff08;一&#xff09;问题背景&#xff08;二&#xff09;网络架构&#xf…

路飞项目--02

补充&#xff1a;axios封装 # 普通使用&#xff1a;安装 &#xff0c;导入使用 const filmListreactive({result:[]}) axios.get().then() async function load(){let responseawait axios.get()filmList.resultresponse.data.results } # 封装示例&#xff1a;请求发出去之前…

【计算机组成与体系结构Ⅱ】虚拟存储器以及虚拟变换(实验)

实验7&#xff1a;虚拟存储器以及虚拟变换 一、实验目的 1&#xff1a;加深对虚拟存储器基本概念、基本组织结构以及基本工作原理的理解。 2&#xff1a;掌握页式、段式&#xff0c;段页式存储的原理以及地址变换的方法。 3&#xff1a;理解LRU与随机替换的基本思想。 二、…

easy Exsel导出

目录 一、首先引入依赖 二、然后封装一个VO 三、Controller层 四、Service实现类 引用样式 自适应列宽 自适应行高 五、测试 postman ​编辑 浏览器 异常 分配到这个任务了&#xff0c;写个小demo记录下&#xff0c;具体可参考EasyExcel官方文档 我用的是web上传…

redis数据安全(五)事务

一、概念&#xff1a; 1、介绍&#xff1a;Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令&#xff0c;一个事务中所有命令都会被序列化。在事务执行过程&#xff0c;会按照顺序串行化执行队列中的命令&#xff0c;其他客户端提交的命令请求不会插入到事务执行命…

css实现动态水波纹效果

效果如下&#xff1a; 外层容器 (shop_wrap)&#xff1a; 设置外边距 (padding) 提供一些间距和边距 圆形容器 (TheCircle)&#xff1a; 使用相对定位 (position: relative)&#xff0c;宽度和高度均为 180px&#xff0c;形成一个圆形按钮圆角半径 (border-radius) 设置为 50%&…

Linux编译器--gcc和g++使用

gcc和g使用 一、gcc/g的作用1.1 预处理1.2 编译1.3 汇编1.4 链接 二、静态库和动态库三、make/Makefile3.1 make/Makefile3.2 依赖关系和依赖方法3.3 多文件编译3.4 make原理3.5 项目清理 四、linux下的第一个小程序-进度条4.1 行缓冲区的概念4.2 \r和\n4.3 进度条代码 一、gcc…

rt-thread修改全局中断屏蔽函数,解决内核频繁关闭中断影响精密计时问题

带rtt-nano实时操作系统的小板子需要读取单总线设备&#xff0c;使用软件延时吧&#xff0c;总是由于时隙不精确&#xff0c;通信不稳定。按说不稳定情况也不频繁&#xff0c;但考虑到未来需要对上百、上千米外的单总线设备通信&#xff0c;开发的时候偷个懒&#xff0c;到应用…

Jmeter后置处理器——JSON提取器

目录 1、简介 2、使用步骤 1&#xff09;添加线程组 2&#xff09;添加http请求 3&#xff09; 添加JSON提取器 1、简介 JSON是一种简单的数据交换格式&#xff0c;允许互联网应用程序快速传输数据。JSON提取器可以从JSON格式响应数据中提取数据、简化从JSON原始数据中提取特定…