代码随想录算法训练营第四十一天|Day41 动态规划

188.买卖股票的最佳时机IV

视频讲解:https://www.bilibili.com/video/BV16M411U7XJ

https://programmercarl.com/0188.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIV.html

思路

#define max(a, b) ((a) > (b) ? (a) : (b))
int maxProfit(int k, int* prices, int pricesSize) {if(pricesSize == 0){return 0;}int dp[pricesSize][2 * k + 1];memset(dp, 0, sizeof(int) * pricesSize * (2 * k + 1));for (int j = 1; j < 2 * k; j += 2) {dp[0][j] = -prices[0];}for (int i = 1;i < pricesSize; i++) {for (int j = 0; j < 2 * k - 1; j += 2) { 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[pricesSize - 1][2 * k];
}

学习反思

动态规划解决的股票交易问题。代码中定义了一个max函数来取两个数中的最大值。然后定义了一个maxProfit函数,参数分别是k(交易次数限制)、prices(股票价格数组)、pricesSize(价格数组的大小)。函数首先判断如果pricesSize为0,直接返回0。然后定义了一个二维数组dp,大小为pricesSize行,2 * k + 1列。然后使用memset函数将dp数组全部初始化为0。接下来使用两个for循环来计算dp数组的值。第一个for循环用来初始化dp数组的第一行,偶数列的值都为0,奇数列的值都为-prices[0]。第二个for循环用来计算dp数组剩下的值。外层循环遍历pricesSize,内层循环遍历2 * k - 1。在循环体内,使用max函数分别更新dp[i][j+1]和dp[i][j+2]的值。其中dp[i][j+1]的更新规则是将前一天的dp[i-1][j+1]和dp[i-1][j] - prices[i]取最大值;dp[i][j+2]的更新规则是将前一天的dp[i-1][j+2]和dp[i-1][j+1] + prices[i]取最大值。最后返回dp[pricesSize-1][2 * k],即最后一天结束后的最大利润。

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

本题加了一个冷冻期,状态就多了,有点难度,大家要把各个状态分清,思路才能清晰

视频讲解:https://www.bilibili.com/video/BV1rP4y1D7ku

https://programmercarl.com/0309.%E6%9C%80%E4%BD%B3%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E6%97%B6%E6%9C%BA%E5%90%AB%E5%86%B7%E5%86%BB%E6%9C%9F.html

思路

#define max(a, b) ((a) > (b) ? (a) : (b))
int maxProfit(int* prices, int pricesSize) {if(pricesSize == 0){return 0;}int dp[pricesSize][4];memset(dp, 0, sizeof (int ) * pricesSize * 4);dp[0][0] = -prices[0];for (int i = 1; i < pricesSize; ++i) {dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][1] - prices[i], dp[i - 1][3] - prices[i]));dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);dp[i][2] = dp[i - 1][0] + prices[i];dp[i][3] = dp[i - 1][2];}return max(dp[pricesSize - 1][1], max(dp[pricesSize - 1][2], dp[pricesSize - 1][3]));
}

学习反思

用动态规划解决股票买卖问题的函数。通过观察代码,可以看出代码中使用了一个二维数组dp来记录每一天的股票交易状态。首先,定义了一个宏函数max,用来取两个数的最大值。然后,函数开始对dp数组进行初始化,将其全部设置为0。接下来,通过一个for循环,遍历每一天的股票价格。在每一天,根据前一天的交易状态,更新当天的交易状态。dp[i][0]表示在第i天持有股票时的最大收益,它可以由以下三种情况转移得到:第一种情况是继续保持空仓,即dp[i-1][0];第二种情况是在第i-1天卖出,并在第i天买入,即dp[i-1][1]-prices[i];第三种情况是在第i-1天卖出,并在第i天买入,即dp[i-1][3]-prices[i]。这三种情况中取最大值作为dp[i][0]的值。dp[i][1]表示在第i天不持有股票,且处于冷冻期时的最大收益,它可以由两种情况转移得到:第一种情况是继续保持空仓,即dp[i-1][1];第二种情况是在第i-1天卖出股票,即dp[i-1][3]。这两种情况中取最大值作为dp[i][1]的值。dp[i][2]表示在第i天不持有股票,且不处于冷冻期时的最大收益,它可以由以下情况转移得到:第一种情况是在第i-1天持有股票,且在第i天卖出,即dp[i-1][0]+prices[i];第二种情况是在第i-1天处于冷冻期,即dp[i-1][2]。这两种情况中取最大值作为dp[i][2]的值。dp[i][3]表示在第i天不持有股票且处于冷冻期时的最大收益,它可以由以下情况转移得到:第一种情况是在第i-1天不持有股票,且不处于冷冻期,即dp[i-1][1];第二种情况是在第i-1天不持有股票且处于冷冻期,即dp[i-1][2]。这两种情况中取最大值作为dp[i][3]的值。最后,返回dp数组中的最大值,即是最大收益。

714.买卖股票的最佳时机含手续费

视频讲解:https://www.bilibili.com/video/BV1z44y1Z7UR

https://programmercarl.com/0714.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA%E5%90%AB%E6%89%8B%E7%BB%AD%E8%B4%B9%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html

思路

#define max(a, b) ((a) > (b) ? (a) : (b))
int maxProfit(int* prices, int pricesSize, int fee) {int dp[pricesSize][2];dp[0][0] = -prices[0];dp[0][1] = 0;for (int i = 1; i < pricesSize; ++i) {dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);}return dp[pricesSize - 1][1];
}

学习反思

解决股票买卖问题的动态规划解法。其中,prices是一个整数数组,表示一系列股票的价格,pricesSize表示数组的大小,fee表示交易手续费。该算法使用一个二维数组dp来记录每一天的最大利润。dp[i][0]表示第i天持有股票时的最大利润,dp[i][1]表示第i天不持有股票时的最大利润。算法的思路是从第一天开始,对于每一天i,有两种情况:持有股票或不持有股票。如果持有股票,那么前一天可能也持有股票,也可能是在前一天卖掉了股票,然后再买入股票。因此,dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i])。如果不持有股票,那么前一天可能也没有持有股票,也可能是在前一天卖掉了股票。因此,dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]-fee)。最后,返回dp[pricesSize-1][1]即为最终的最大利润。算法的时间复杂度是O(n),

总结

加油!!!

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

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

相关文章

kdump 应该怎么安装 linux-crashdump kdump-tools

sudo apt install linux-crashdump sudo apt install crash sudo apt install kdump-tools 1. 两个工具的关系 linux-crashdump kdump-tools 在 Ubuntu 上安装 kdump 功能&#xff0c;这两个包都是相关的&#xff0c;但有不同的作用. linux-crashdump 是一个元包&#xff08;…

pdf转excel;pdf中表格提取

一、问题描述 在工作中或多或少会遇到&#xff1a;需要将某份pdf中的表格数据提取出来&#xff0c;以便能够“修改使用”数据 可将pdf中的表格提取出来&#xff0c;解决办法还有点复杂 尤其涉及“pdf中表格不是标准的单元格”的时候&#xff0c;提取数据到excel不太容易 比…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

qt配合映美精取图开发

最近开发一个项目&#xff0c;用映美精相机配合halcon做取图开发&#xff0c;由于网上资料小特意写个记录。到映美精官网下载驱动&#xff0c;映美精官网&#xff0c;下载映美精的工具开发包SDK 映美精的SDK下载SDK后找到classlib文件夹 里面就是SDK新建一个qt程序&#xff0c…

springboot yml文件数据源出现警告/报黄/数据库配置警告问题

1、看一下数据源的依赖是不是都引入完整了 2、看一下数据源是否有拼写错误 上图就是数据源拼写错误

手机上用什么方法可以切换ip

手机上用什么方法可以切换IP&#xff1f;在某些特定情境下&#xff0c;用户可能需要切换手机的IP地址&#xff0c;以满足网络安全、隐私保护或绕过地域限制等需求。下面以华为手机为例&#xff0c;将详细介绍手机IP地址切换的几种方法&#xff0c;帮助用户轻松实现这一目标。 一…

python可视化将多张图整合到一起(画布)

这周有点事忙着&#xff0c;没时间重温刚结束的Mathurcup数学建模&#xff0c;这两天也是再看了下&#xff0c;论文还是赶紧挺烂的&#xff0c;但比国赛又有进步&#xff08;说起国赛又不得不抱怨了&#xff0c;基本其余省份都发了&#xff0c;但江西......哎&#xff09;。哎&…

vue2,vue3,uniapp,小程序实现前端url生成二维码

最近遇到一个项目&#xff0c;api返回url地址&#xff0c;前端通过地址生成二维码。 话不多说直接上代码&#xff0c;亲测有效&#xff0c;希望能帮助大家&#xff0c;同时如果有更好的方法希望大家能够分享 1、第一步&#xff0c;在项目的utils文件夹下面创建一个weapp-qrco…

【韩老师零基础30天学会Java】01章

什么是程序&#xff1f; JavaEE企业版 示例1 public class Test{public static void main(String[] args){int res11;System.out.println("result"res);}}D:\Java\code>javac Test.javaD:\Java\code>java Test 缁撴灉2D:\Java\code>javac Test.javaD:\Java…

华为交换机实现不同VLAN内的互通配置(汇聚层设备作为网关)

背景如下&#xff1a; 如下图所示&#xff0c;PC1和PC2分别属于VLAN 2和VLAN 3&#xff0c;通过接入层设备DeviceB接入汇聚层设备DeviceA。PC3属于VLAN 4&#xff0c;通过接入层设备DeviceC接入汇聚层设备DeviceA。DeviceC不做任何配置&#xff0c;当做HUB即插即用。汇聚层设备…

SpringBoot旅游酒店系统源码免费分享+本地部署及介绍 - 幽络源

初步介绍 这是一套基于SpringBoot的旅游酒店系统&#xff0c;含有前台和后台&#xff0c;需要注意的是图片文件是存放于target中的&#xff0c;因此不建议删除这个临时目录。 原文及源码获取链接 > SpringBoot旅游酒店管理系统免费分享-幽络源 所需环境 JDK1.8、Maven、…

Java开发中的分布式锁使用教程

1. 基于ZooKeeper的分布式锁 1.1 引入依赖 在项目的pom.xml文件中添加以下依赖&#xff1a; <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>latest</version> </dep…

zynq pl设计中断问题

问题 逻辑工程师vivado工具生成的pl hdf文件后,通过xilinx的工具解析的的dts文件,会出现中断号异常的问题。 原始问题肯定是硬件表现为通讯异常,此处以网口为例,则网口不通。 网口查询 uboot下网口信息 如下命令查询到 两个mac下对应的phy,地址分别为4和6,和硬件设计一…

Scala 的包及其导入

Scala使用包来创建用于模块化程序的命名空间。通过在Scala文件的顶部声明一个或多个包名称可以创建包&#xff0c;另一种声明包的方式是使用0&#xff0c;这种方式可以嵌套包&#xff0c;并且提供更好的范围与封装控制。对于包的导入&#xff0c;Scala与Java的区别之一便是&…

【MySQL】关于MySQL启动后mysqld_safe和mysqld进程

在mysql服务器启动后&#xff0c;有2个进程mysqld_safe和mysqld,这是为啥&#xff1f; # ps -ef | grep mysqld root 6488 3324 0 Sep03 pts/0 00:00:00 /bin/sh /mysqlsoft/mysql/bin/mysqld_safe --defaults-file/etc/my.cnf --usermysql mysql 7327 6488 0 Sep03 pts/0 0…

Rust @绑定(Rust@绑定)(在模式匹配的同时将值绑定到变量)

文章目录 Rust中的绑定基础概念示例&#xff1a;基本模式匹配 绑定的使用示例&#xff1a;范围匹配并绑定变量 深入探索绑定的好处示例&#xff1a;复杂数据结构中的应用 总结 附加 Rust中的绑定 Rust 语言以其强类型系统和内存安全的特性著称。在进行模式匹配时&#xff0c;R…

数据结构-图的概念

不存在空图现象,顶点集不能为空,边集可以为空 研究链接一个顶点的边有多少条非常有意义 无向图的度边的二倍 有向图的入度出度,度边数 有向图一致 重点 子图必须联通,尽可能多的边和结点 对于一个生成树,他有n个节点就有n-1条边 修路问题将各个村庄相连,由于经费有限,只能选择…

黑马程序员Redis学习【持续更新】

Redis基础 一、Redis入门 1.Redis简介 【1】为什么学习Redis Redis是一个基于内存的key-value结构数据库。「Remote Dictionary Service」的首字母缩写&#xff0c;也就是「远程字典服务-remote dictionary server」。 基于内存存储&#xff0c;读写性能高适合存储热点数据…

利用SEO在4个月内打造每月940美元的导航站

在软件开发领域&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;的潜力常常被人们低估&#xff0c;但它却能为网站增长带来显著效果。特别是在AI技术的加持下&#xff0c;你可以极大地加速流量增长并自动化大部分工作。本文将详细介绍一名Reddit用户如何在4个月内&#xf…

字节青训-数字字符串格式化

问题描述 小M在工作时遇到了一个问题&#xff0c;他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式&#xff0c;并且保留小数部分。小M还发现&#xff0c;有时候输入的数字字符串前面会有无用的 0&#xff0c;这些也需要精简掉。请你帮助小M编写程序&…