力扣-股票买入问题

embedded/2025/3/11 3:03:45/

dp

dp元素代表最大利润

f[j][1] 代表第 j 次交易后持有股票的最大利润。在初始状态,持有股票意味着你花钱买入了股票,此时的利润应该是负数(扣除了买入股票的成本),而不是 0。所以,把 f[j][1] 初始化为负无穷大

f[j][0] 表示第 j 次交易完成后未持有股票的最大利润。当还未开始进行任何有效的股票买卖操作时,也就是处于初始状态,此时没有持有股票且利润为 0 

所以有了如下初始化

for (int j = 0; j < k + 2; j++) {for (int l = 0; l < 2; l++) {f[j][l] = Double.NEGATIVE_INFINITY;}}
// 初始化状态,第 j 次交易未持有股票时利润为 0for (int j = 1; j < k + 2; j++) {f[j][0] = 0;
}

 

因为可以交易0~k次,一共k+1种选择,而i = 0时,状态转移会出现i=-1的dfs,所以要开辟k+2个空间,而我们实际填写k+1种

因为数组不能有-1的索引,所以整体偏移,用0代表-1,1代表0.所以j<0而不是j<=0

import java.util.List;public class StockTrading {public int maxProfit(List<Integer> prices) {// 最多允许的交易次数int k = 2;// 初始化动态规划数组 fdouble[][] f = new double[k + 2][2];for (int j = 0; j < k + 2; j++) {for (int l = 0; l < 2; l++) {f[j][l] = Double.NEGATIVE_INFINITY;}}// 初始化状态,第 j 次交易未持有股票时利润为 0for (int j = 1; j < k + 2; j++) {f[j][0] = 0;}// 遍历每一天的股票价格for (int i = 0; i < prices.size(); i++) {int p = prices.get(i);// 从后往前更新状态for (int j = k + 1; j > 0; j--) {// 更新第 j 次交易未持有股票的最大利润f[j][0] = Math.max(f[j][0], f[j][1] + p);// 更新第 j 次交易持有股票的最大利润f[j][1] = Math.max(f[j][1], f[j - 1][0] - p);}}// 返回最终结果,即最后一次交易未持有股票的最大利润return (int) f[f.length - 1][0];}
}

有冷冻期

修改状态转移方程

因为卖出的股票不能是前一天买入的了,所以不能-1要用合理时间的股票  

交易次数必须为2

只需要不断维护两次交易的利润即可,不需要记录全部交易的利润

这里不用开辟k+2的空间了,因为规定必须交易两次,所以状态转移方程没有变量了,而是具体的1和2,就不会出现-1的情况

import java.util.List;public class StockTrading {public int maxProfit(List<Integer> prices) {// 交易次数必须为2次int k = 2;// 初始化动态规划数组 f// f[j][0] 表示第 j 次交易未持有股票的最大利润// f[j][1] 表示第 j 次交易持有股票的最大利润int[][] f = new int[k + 1][2];// 初始化状态for (int j = 1; j <= k; j++) {f[j][0] = Integer.MIN_VALUE; // 初始时,未持有股票的利润为最小整数f[j][1] = Integer.MIN_VALUE; // 初始时,持有股票的利润为最小整数}f[0][0] = 0; // 第0次交易未持有股票的利润为0// 遍历每一天的股票价格for (int i = 0; i < prices.size(); i++) {int p = prices.get(i);// 更新第 2 次交易的状态f[2][0] = Math.max(f[2][0], f[2][1] + p); // 第 2 次交易未持有股票f[2][1] = Math.max(f[2][1], f[1][0] - p); // 第 2 次交易持有股票// 更新第 1 次交易的状态f[1][0] = Math.max(f[1][0], f[1][1] + p); // 第 1 次交易未持有股票f[1][1] = Math.max(f[1][1], -p); // 第 1 次交易持有股票}// 返回最终结果,即第 2 次交易未持有股票的最大利润// 如果无法完成两次交易,返回 0 或其他特殊值return Math.max(f[2][0], 0); // 确保不会返回负值}
}

网课:买卖股票的最佳时机【基础算法精讲 21】_哔哩哔哩_bilibili


http://www.ppmy.cn/embedded/171650.html

相关文章

服务器配置完成后如何启动或者终止java后端,相关运行文件如下:

很多人跟着视频或者查询资料服务器配置完成后不知该如何启动或者终止java后端&#xff0c;我个人是写了一个运行文件和停止文件&#xff1a; 一、start.sh ME 你的jar包的文件名.jar nohup java -jar $ME > server.log 2>&1 & echo start success使用方法&…

python用户图形界面wxpython库安装与使用

要开始使用 wxPython 库来创建 Python 用户图形界面&#xff0c;首先需要安装这个库。在大多数情况下&#xff0c;你可以通过 pip 来安装 wxPython。下面我会指导你完成安装过程&#xff0c;并给出一个简单的例子来展示如何使用 wxPython 创建一个基本的窗口应用程序。 安装 w…

【无人机路径规划】基于麻雀搜索算法(SSA)的无人机路径规划(Matlab)

效果一览 代码获取私信博主基于麻雀搜索算法&#xff08;SSA&#xff09;的无人机路径规划&#xff08;Matlab&#xff09; 一、算法背景与核心思想 麻雀搜索算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种受麻雀群体觅食行为启发的元启发式算法&#xff0…

Python从入门到精通1:FastAPI

引言 在现代 Web 开发中&#xff0c;API 是前后端分离架构的核心。FastAPI 凭借其高性能、简洁的语法和自动文档生成功能&#xff0c;成为 Python 开发者的首选框架。本文将从零开始&#xff0c;详细讲解 FastAPI 的核心概念、安装配置、路由设计、请求处理以及实际应用案例&a…

Scikit-learn库中用于特征缩放的类MinMaxScaler用法详细介绍并举例说明

Scikit-learn库中用于特征缩放的类MinMaxScaler用法详细介绍并举例说明 目录 Scikit-learn库中用于特征缩放的类MinMaxScaler用法详细介绍并举例说明1.类MinMaxScaler介绍1.1 转换公式(1) 核心转换公式&#xff08;2&#xff09;转换公式举例 1.2 MinMaxScaler参数(1) feature_…

STM32常见外设的驱动示例和代码解析

以下是针对STM32常见外设的驱动示例和代码解析,基于HAL库实现,适用于大多数STM32系列(如F1/F4/H7等),可根据具体型号调整引脚和时钟配置。 1. GPIO驱动 应用场景:控制LED、按键检测、继电器开关等。 示例代码: // 初始化LED(推挽输出) void LED_Init(void) {GPIO_In…

【3】VS Code 新建上位机项目---C#窗体与控件开发

【3】VS Code 新建上位机项目---C#窗体与控件开发 1 窗体1.1 新建窗体1.2 windows程序与窗口的关系1.3 windows程序的事件1.3.1 定义事件与处理事件1.3.2 关联事件1.3.3 Windows窗体对象创建与显示(show与ShowDialog())2 控件与容器2.1 常用容器2.1.1 Groupbox2.1.2 Pannel2.1.…

模型压缩技术(二),模型量化让模型“轻装上阵”

一、技术应用背景 在人工智能蓬勃发展的浪潮下&#xff0c;大模型在自然语言处理、计算机视觉等诸多领域大放异彩&#xff0c;像知名的GPT以及各类开源大语言模型&#xff0c;其规模与复杂度持续攀升。然而&#xff0c;这一发展也带来了挑战&#xff0c;模型越大&#xff0c;对…