动态规划 —— dp 问题-买卖股票的最佳时机III

ops/2024/11/14 19:13:01/

1. 买卖股票的最佳时机III

题目链接:

123. 买卖股票的最佳时机 III - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/

 


2. 题目解析 


3. 算法原理

状态表示:以某一个位置为结尾或者以某一个位置为起点

  

dp[i]表示:第i天结束之后,此时的最大利润 :两种情况:

   

1. f[i][j]表示:第i天结束之后,完成了j次交易,处于买入状态,此时的最大利润

  

2. g[i][j]表示:第i天结束之后,完成了j次交易,处于卖出状态,此时的最大利润

2. 状态转移方程

  

在第i-1天处于买入状态,看买入状态能不能到自己,看卖出状态能不能到买入状态,另一个状态也是如此,一共4种状态

  

买入状态到卖出状态到
买入状态什么都不干-prices[i](买股票)
卖出状态+prices[i](交易次数+1)什么都不干

1. f[i][j] = max(f[i-1][j] , g[i-1][j] - prices[i])

  

2. g[i][j] = max(g[i-1][j] , f[i-1][j-1] + prices[i]

  

3. 初始化 :把dp表填满不越界,让后面的填表可以顺利进行

  

因为是在第i-1天处于买入/卖出状态,所以当交易次数为0时,就相当于在第i天为-1,那么就会导致越界

 

所以我们可以修改一下第二个状态转移方程来判断一下,我们可以看到卖出状态到自己的情况是不会改变的,所以只用修改买入状态到卖出状态  :

  

                                                1. g[i][j] = g[i-1][j](此状态一定不会越界)

   

                                                2. if(j-1>=0)     g[i][j] = max(g[i][j] , f[i-1][j-1] + prices[i]

  

在查找f[i-1][j-1] + prices[i]状态的时候先判断一下 下标是否合法(if(j-1>=0)),然后再求max 

定义一个正无穷大/小的时候涉及到需要进行加减操作的时候,不要使用INT_MIN/MAX,因为如果INT_MIN减去一个数的话就会变成一个非常大的整数而导致溢出,所以我们最好用 +/- 0x3f3f3f3f 来表示最小值

   

  

本题初始化就是先将表里的所有值都初始化为-无穷大,再把f[0][0] = --prices[0],g[0][0] = 0 

4. 填表顺序 

    

本题的填表顺序是:从上往下填写每一行,每一行从左往右,两个表同时填

5. 返回值 :题目要求 + 状态表示    

    

因为是要最大利润,所以买入状态不用考虑  

本题的返回值是:g表里最后一行里面的最大值


4. 代码  

动态规划的固定四步骤:1.  创建一个dp表

                                        2. 在填表之前初始化

                                        3. 填表(填表方法:状态转移方程)

                                        4. 确定返回值

class Solution {
public:const int INF=0x3f3f3f3f;//将无穷大赋予给INFint maxProfit(vector<int>& prices) {int n = prices.size();//1.  创建dp表//3:交易次数的三列:0,1,2,再将所有的位置都变成负无穷大vector<vector<int>>f(n,vector<int>(3,-INF));auto g=f;//2. 在填表之前初始化f[0][0]=-prices[0];g[0][0]=0;//3. 填表(填表方法:状态转移方程)for(int i=1;i<n;i++){for(int j=0;j<3;j++)//j只有0,1,2三种状态{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]);}}//g表里最后一行里面的最大值int ret=0;for(int j=0;j<3;j++)ret=max(ret,g[n-1][j]);return ret;}
};


未完待续~


http://www.ppmy.cn/ops/133654.html

相关文章

目前区块链服务商备案支持的区块链技术类型

status"success"data1-name"比特币/Bitcoin/BTC"3-name"以太坊/Ethereum/ETH"875-name"超级账本/Hyperledger"5-name"柚子/EOS/EOS"6-name"恒星链/Stellar/XLM"1055-name"Quorum"7-name"莱特币/Li…

如何在Puppeteer中实现表单自动填写与提交:问卷调查

一、介绍 在现代市场研究中&#xff0c;问卷调查是一种重要的工具。企业通过在线问卷调查了解消费者对产品或服务的需求、偏好和满意度&#xff0c;从而为产品开发、市场营销和服务优化提供指导。然而&#xff0c;对于爬虫技术专家来说&#xff0c;批量自动化地填写和提交问卷…

OCRSpace申请free api流程

0.OCRSpace概述 OCR.Space是一款功能强大的在线光学字符识别&#xff08;OCR&#xff09;工具。 格式与语言支持广泛&#xff1a;支持多种图片格式&#xff0c;如 JPG、PNG、GIF、PDF 等作为输入。在语言方面&#xff0c;它支持英语、中文、法语、德语等20多种语言的文字识别…

SQL 外连接

1 外连接 外连接是一种用于结合两个或多个表的方式&#xff0c;返回至少一个表中的所有记录。 左外连接 LEFT JOIN&#xff0c;左表为驱动表&#xff0c;右表为从表。返回驱动表的所有记录以及从表中的匹配记录。如果从表没有匹配&#xff0c;则结果中从表的部分为NULL。 右…

机器学习(1)线性回归

前言   线性回归算法是机器学习深度学习入门的必学的算法&#xff0c;其算法原理虽然简单&#xff0c;但是却蕴含着机器学习中的一些重要的基本思想。许多功能更为强大的非线性模型可在线性模型的基础上通过引入层级结构或高维映射而得。同时机器学习深度学习的核心思想就是优…

渗透测试之 -- Linux基础

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章笔记的只是方便各位师傅学习知识,以下网站涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一、Openssl 1、openssl passwd -1 123 openssl一个开源加密工具包&#xff0c;用于各种解密、加…

宝塔面板中使用Acme SSL.cn申请的免费HTTPS SSL证书安装步骤

目录 1. 申请SSL证书 2. 宝塔面板安装SSL证书 申请免费ssl证书的网站&#xff1a;AcmeSSL.cn - 一个提供免费HTTPS证书申请的ACME自动化工具网站-免费提供申请Lets Encrypt、ZeroSSL、Google Public CA等CA证书-ACME自动化管理工具。 1. 申请SSL证书 按照上述提到的注册登录、…

netcat工具安装和使用

netcat是一个功能强大的网络实用工具&#xff0c;可以从命令⾏跨⽹络读取和写⼊数据。 netcat是为Nmap项⽬编写的&#xff0c;是⽬前分散的Netcat版本系列的经典。 它旨在成为可靠的后端⼯具&#xff0c;可⽴即为其他应⽤程序和⽤户提供⽹络连接。 一&#xff0c;下载安装 1&a…