C++ day50 动态规划

题目1:123 买卖股票的最佳时机Ⅲ

题目链接:买卖股票的最佳时机Ⅲ

对题目的理解

prices[i]表示股票在第i天的价格,最多可以完成两笔交易,不能同时进行多笔交易

可以买卖一次,两次,也可以不买卖

动态规划

动规五部曲

1)dp数组及下标i的含义

dp[i][0]  不操作(可有可无)股票的最大现金

dp[i][1]  第一次持有股票的最大现金

dp[i][2]  第一次不持有股票的最大现金

dp[i][3]  第二次持有股票的最大现金

dp[i][4]   第二次不持有股票的最大现金

不持有股票现金的状态一定比持有股票的现金多,第二次不持有一定包含第一次不持有的钱

最终求解: dp[prices.size()-1][4]

2)递推公式

dp[i][0] = dp[i-1][0]

dp[i][1] = dp[i-1][1]  前一天已经持有

dp[i][1] = dp[i-1][0]-prices[i]   第i天买入,前一天不操作

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

dp[i][2] = dp[i-1][2]  前一天不持有

dp[i][2] = dp[i-1][1]+prices[i]    第i天卖出 前一天持有

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

dp[i][3] = dp[i-1][3]  前一天已经持有

dp[i][3] = dp[i-1][2] -prices[i]  第i天买入,但是因为是第二次买入,所以应该是在第一次卖出的基础上减去第i天的股票价格

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

dp[i][4] = dp[i-1][4]  前一天不持有

dp[i][4] = dp[i-1][3] + prices[i]  第i天卖出,但是因为是第二次卖出,所以应该在第二次买入的基础上加上第i天的股票价格

dp[i][4] = max(dp[i-1][4],dp[i-1][3]+prices[i])

3)dp数组初始化

从递推公式可以看出,i的状态由i-1的状态决定,所以初始化dp[0]

dp[0][0]=0

dp[0][1]=-prices[0]

dp[0][2]=0(同一天买卖)

dp[0][3]=-prices[0](第二次又买入了)

dp[0][4]=0(第二次又卖出了)

4)遍历顺序

从递推公式可以看出,i的状态由i-1的状态决定,所以从小到大遍历

for(i=1;i<prices.size();i++)  注意从1开始

5)打印dp数组

代码

class Solution {
public:int maxProfit(vector<int>& prices) {//定义dp数组vector<vector<int>> dp(prices.size(),vector<int>(5));//初始化dp数组dp[0][0] = 0;//不操作dp[0][1] = -prices[0];//第一次持有股票dp[0][2] = 0;//第一次不持有股票dp[0][3] = -prices[0];//第二次持有股票dp[0][4] = 0;//第二次不持有股票for(int i=1;i<prices.size();i++){dp[i][0] = dp[i-1][0];dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i]);dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]);dp[i][3] = max(dp[i-1][3],dp[i-1][2]-prices[i]);dp[i][4] = max(dp[i-1][4],dp[i-1][3]+prices[i]);}return dp[prices.size()-1][4];}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n × 5)

不使用dp[i][0]这个数组,直接将dp[i][0]相关的部分注释掉即可

代码

class Solution {
public:int maxProfit(vector<int>& prices) {//定义dp数组vector<vector<int>> dp(prices.size(),vector<int>(5));//初始化dp数组//  dp[0][0] = 0;//不操作dp[0][1] = -prices[0];//第一次持有股票dp[0][2] = 0;//第一次不持有股票dp[0][3] = -prices[0];//第二次持有股票dp[0][4] = 0;//第二次不持有股票for(int i=1;i<prices.size();i++){// dp[i][0] = dp[i-1][0];dp[i][1] = max(dp[i-1][1],-prices[i]);dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]);dp[i][3] = max(dp[i-1][3],dp[i-1][2]-prices[i]);dp[i][4] = max(dp[i-1][4],dp[i-1][3]+prices[i]);}return dp[prices.size()-1][4];}
};

题目2:买卖股票的最佳时机Ⅳ

题目链接:买卖股票的最佳时机Ⅳ

对题目的理解

prices[i]是某支股票在第i天的价格,最多可以完成k笔交易,不能同时参与多笔交易

动规五部曲

1)dp数组及下标i的含义

dp[i][j]:第i天的状态为j(持有股票奇数,不持有股票偶数)所拥有的最大现金,j大于等于0,小于等于2k

最终求解:dp[prices.size()-1][2k]

2)递推公式

for(j=0;j<2k-1;j+=2)  //j控制第几次买卖

第j次持有  dp[i][j+1] = max(dp[i-1][j+1],dp[i][j]-prices[i]);

第j次不持有  dp[i][j+2] = max(dp[i-1][j+2],dp[i][j+1]+prices[i]);

3)dp数组初始化

根据递推公式,j为奇数,表示持有,for(int j=1;j<2k;j+=2)  dp[0][j]=-prices[0]

4)遍历顺序

根据递推公式,从小到大遍历

5)打印dp数组

代码

class Solution {
public:int maxProfit(int k, vector<int>& prices) {//定义dp数组vector<vector<int>> dp(prices.size(),vector<int>(2*k+1));//初始化dp数组for(int j=1;j<2*k;j+=2){//j为奇数下标时全为-prices[0],j是下标,应不超过2k+1dp[0][j]=-prices[0];} //递推for(int i=1;i<prices.size();i++){for(int j=0;j<2*k-1;j+=2){//将j代入j+2,2k-2+2=2k//持有dp[i][j+1]=max(dp[i-1][j+1],dp[i-1][j]-prices[i]);//不持有dp[i][j+2]=max(dp[i-1][j+2],dp[i-1][j+1]+prices[i]);}}return dp[prices.size()-1][2*k];}
};
  • 时间复杂度: O(n * k),其中 n 为 prices 的长度
  • 空间复杂度: O(n * k)

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

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

相关文章

C++-类和对象

目录 一.C语言和C的区别 二.类的引入 三.类的定义 1.类的定义 2.类的成员方法的两种定义方式&#xff1a; 3.类的成员变量的定义 四.类的访问限定符及封装 1.访问限定符 五.面向对象的三大特征 1.面向对象的三大特征分别是什么 2.封装 六.类的作用域 七.创建类对象 1.类…

Leetcode.330 按要求补齐数组

题目链接 Leetcode.330 按要求补齐数组 hard 题目描述 给定一个已排序的正整数数组 n u m s nums nums &#xff0c;和一个正整数 n n n 。从 [ 1 , n ] [1, n] [1,n] 区间内选取任意个数字补充到 n u m s nums nums 中&#xff0c;使得 [ 1 , n ] [1, n] [1,n] 区间内的…

CAN 一: CAN基础知识介绍

1、CAN介绍 1.1、什么是CAN? (1)CAN&#xff08;Controller Area Network:控制器局域网&#xff09;&#xff0c;是ISO国际标准化的串行通信协议。为满足汽车产业的“减少线束的数量”、“通过多个LAN&#xff0c;进行大量数据的高速通信”的需求。 (2)CAN总线的发展历史&a…

纯代码wordpress主题禁止复制粘贴文章内容的方法

很多站长&#xff0c;尤其是新手站长&#xff0c;通常都是内容的搬运工&#xff0c;那我们如何来扼制这些复制他人网站内容且不保留转载链接和署名这种不道德行为&#xff0c;那我们可以通过代码禁用在网站左右复制或是右健功能&#xff0c; 今天大挖就来给大家说说在wordpress…

【LeetCode】每日一题 2023_12_2 拼车(模拟/差分)

文章目录 刷题前唠嗑题目&#xff1a;拼车题目描述代码与解题思路学习大佬题解 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;拼车 题目链接&#xff1a;1094. 拼车 题目描述 代码与解题思路 func carPooling(trips [][]int…

【Linux】第二十四站:模拟实现C语言文件标准库

文章目录 一、实现细节1.需要实现的函数2.fopen的实现3.fclose4.fwrite5.测试6.缓冲区的实现7.FILE中缓冲区的意义 二、完整代码 一、实现细节 1.需要实现的函数 #include "mystdio.h"int main() {_FILE* fp _fopen("test.txt","w");if(fp N…

超大规模集成电路设计----基本概念(二)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----基本概念&#xff08;二&#xff09; 简短的历史回顾(A Brief Historical Perspective)第…

观察者设计模式

package com.jmj.pattern.observer;/*抽象观察者类*/ public interface Observer {void update(String message);}package com.jmj.pattern.observer;/*** 抽象主题角色*/ public interface Subject {//添加观察者对象void attach(Observer observer);//删除订阅者void detach(…

LeetCode(51)简化路径【栈】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 简化路径 1.题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff…

SmartSoftHelp8,FrameCode极速二次开发框架源码

1.winform outlook style UI C/S 极速开发框架 netframework 2.0 2.winform toolbar style UI C/S 极速开发框架 netframework 2.0 3.WPF toolbar style UI C/S 极速开发框架 netframework 4.0 4.Xadmin-UI jquery B/S 极速开发框架 5.Vue element UI B/S…

Presto基础学习--学习笔记

1&#xff0c;Presto背景 2011年&#xff0c;FaceBook的数据仓库存储在少量大型hadoop/hdfs集群&#xff0c;在这之前&#xff0c;FaceBook的科学家和分析师一直靠hive进行数据分析&#xff0c;但hive使用MR作为底层计算框架&#xff0c;是专为批处理设计的&#xff0c;但是随…

在vue3项目嵌套 导入老项目 jQuery项目,减少重复开发

背景&#xff1a; 公司管理平台项目一直是前辈用jQuery做的&#xff0c;为扩展根据自身的技术栈&#xff0c;将jQuery的老项目嵌套入vue3的框架&#xff0c;新功能用vue开发&#xff0c;旧的功能不动直接在vue3用iframe容器来展示 嵌套步骤 2种方式嵌套&#xff0c;一个是已…

微机原理——并行接口8255学习1

目录 并行接口特点 可编程并行接口芯片8255 8255端口地址 8255的三种工作方式 8255的两种命令&#xff08;方式命令和C端口命令&#xff09; 由用户扩展的并行接口8255的应用 声光报警器接口设计 步进电机控制接口设计 PA端口实现跑马灯 PB端口实现按键输入 并行接口特…

同旺科技 USB TO SPI / I2C --- 调试W5500_Ping测试

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 设置寄存器&#xff1a; SHAR&#xff08;源MAC地址寄存器&#xff09;&#xff0c;该寄存器用来设置源MAC…

【预计IEEE出版|EI征稿通知】第六届下一代数据驱动网络国际学术会议 (NGDN 2024)

第六届下一代数据驱动网络国际学术会议 (NGDN 2024) The Sixth International Conference on Next Generation Data-driven Networks 2024年4月26-28日 | 中国沈阳 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉 (IEEETrustCom-2022) 成功举…

如何查看Microsoft Office 使用期限

1.进入到 Office 软件的安装目录&#xff08;******\Microsoft Office\Office&#xff09; ## 以管理员身份打开 Windows PowerShell输入以下命令&#xff0c;回车 cscript ospp.vbs /dstatusREMAINING GRACE 一行表示激活剩余天数&#xff08;括号内是换算成的剩余分钟数…

Android实验:绑定service实验

目录 实验目的实验内容实验要求项目结构代码实现代码解释结果展示 实验目的 充分理解Service的作用&#xff0c;与Activity之间的区别&#xff0c;掌握Service的生命周期以及对应函数&#xff0c;了解Service的主线程性质&#xff1b;掌握主线程的界面刷新的设计原则&#xff…

文心一言 VS 讯飞星火 VS chatgpt (148)-- 算法导论12.2 3题

三、用go语言&#xff0c;写出过程 TREE-PREDECESSOR 的伪代码。 文心一言&#xff1a; 以下是使用Go语言编写的TREE-PREDECESSOR函数的伪代码&#xff1a; func TREE-PREDECESSOR(node) { if node.parent ! nil { return node.parent } // 如果节点是根节点&#xff0c…

Centos图形化界面封装OpenStack Ubuntu镜像

目录 背景 环境 搭建kvm环境 安装ubuntu虚机 虚机设置 系统安装 登录虚机 安装cloud-init 安装cloud-utils-growpart 关闭实例 删除细节信息 删除网卡细节 使虚机脱离libvirt纳管 结束与验证 压缩与转移 验证是否能够正常运行 背景 一般的镜像文件在上传OpenSt…

第 374 场 LeetCode 周赛题解

A 找出峰值 枚举 class Solution { public:vector<int> findPeaks(vector<int> &mountain) {int n mountain.size();vector<int> res;for (int i 1; i < n - 1; i)if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i 1…