动态规划-简单多状态dp问题——123.买卖股票的最佳时机|||

devtools/2024/10/18 14:17:06/

1.题目解析

题目来源:123.买卖股票的最佳时机|||——力扣

测试用例

2.算法原理

1.状态表示

根据题目可以看出每一天的状态都有"买入""卖出"两种状态,但是还有交易次数限制,因此创建两个二维dp表,f表存储"买入"状态的利润,g表存储"卖出"状态的利润

f[i][j]:第i天结束时处于"买入"状态的最大利润,此时总交易次数为j次

g[i][j]:第i天结束时处于"卖出"状态的最大利润,此时总交易次数为j次

2.状态转移方程

3.初始化

根据状态转移方程可知填表时每个位置都需要前一个位置的数据,因此需要初始化两个表第一行的元素,如下图

其中的负无穷是-0x3f3f3f3f,指的是INT_MIN的一半,是为了避免栈溢出

4.填表顺序

从上到下,每一行从左到右,两个表一起填入

5.返回值 

返回处于"卖出"状态的最后一天内最高的利润,因为处于"买入"状态说明手上依旧持有股票,一定不是最大利润则不考虑f表

3.实战代码

class Solution {
public:const int INF = 1e5 + 1;int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> f(n, vector<int>(3, -INF));vector<vector<int>> g(n, vector<int>(3, -INF));f[0][0] = -prices[0];g[0][0] = 0;for (int i = 1; i < n; i++) {for (int j = 0; j < 3; j++) {f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);g[i][j] = g[i - 1][j];if (j >= 1) {g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);}}}int ret = 0;for (int j = 0; j < 3; j++) {ret = max(ret, g[n - 1][j]);}return ret;}
};

http://www.ppmy.cn/devtools/126739.html

相关文章

面试经典150题刷题记录

数组部分 1. 合并两个有序的子数组 —— 倒序双指针避免覆盖 88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使…

Android 禁止App字体随系统大小而更改

运营反馈&#xff0c;老年用户的手机多设置为大字体&#xff0c;在使用我们app过程中&#xff0c;由于字体被放大&#xff0c;导致布局错乱&#xff0c;部分功能按键遮挡&#xff0c;无法正常使用。   收到问题&#xff0c;着手解决&#xff0c;除了对界面布局进行改写&#…

QT--自定义信号槽、信号槽的连接方式、信号槽扩展、一个信号连接两个槽函数、多个信号连接一个槽函数、信号连接信号、断开连接

自定义信号槽 自定义信号和槽的条件&#xff1a; 自定义的类&#xff0c;要继承自 QObject自定义的类&#xff0c;其中要声明一个宏 Q_OBJECT 只有满足了这两个条件才可以正常使用信号槽机制 接下来&#xff0c;我们通过一个案例&#xff0c;演示自定义信号槽的使用。 案例…

python爬虫之使用 Beautiful Soup

Beautiful Soup 是 Python 中用于从 HTML 和 XML 文件中提取数据的库。它通常与 HTTP 请求库&#xff08;如 requests&#xff09;一起使用来构建网络爬虫。以下是一个详细的教程&#xff0c;教你如何使用 Beautiful Soup 来爬取网页内容。 1. 安装必要的库 首先&#xff0c;…

开发中众多框架的个人理解,Unity设计模式,MVC,MVVM框架

前往个人博客&#xff0c;获取更好的阅读体验 开发中众多框架的个人理解 首先&#xff0c;无论使用什么框架&#xff0c;使用什么设计模式&#xff0c;本质都是为了分离逻辑&#xff0c;方便扩展&#xff0c;多人协同。换句话说&#xff0c;就是让代码质量更高; 所以并不需要具…

问:JVM当中的垃圾分类怎么搞?

在Java中&#xff0c;JVM&#xff08;Java虚拟机&#xff09;的垃圾识别与分类是自动内存管理的重要组成部分。这一过程主要通过垃圾收集器&#xff08;Garbage Collector&#xff09;实现&#xff0c;旨在识别和回收不再被程序引用的对象&#xff0c;以释放内存空间。 1. 垃圾…

[k8s理论知识]3.docker基础(二)隔离技术

容器其实是一种沙盒技术&#xff0c;其核心是通过约束和修改进程的动态表现&#xff0c;为其创建一个边界。这个边界确保了应用与应用之间不会相互干扰&#xff0c;同时可以方便在不同的环境中迁移&#xff0c;这是PaaS最理想的状态。 程序是代码的可执行镜像&#xff0c;通常…

极简版Java敏感词检测SDK

敏感词工具 sensitive-word 基于 DFA 算法实现的高性能敏感词工具&#xff0c;开源在GitHub&#xff1a;https://github.com/houbb/sensitive-word。用于敏感词/违禁词/违法词/脏词等的识别和阻拦&#xff0c;是基于 DFA 算法实现的高性能 java 敏感词过滤工具框架。 使用场景…