【学会动态规划】乘积为正数的最长子数组长度(21)

目录

动态规划怎么学?

1. 题目解析

2. 算法原理

1. 状态表示

2. 状态转移方程

3. 初始化

4. 填表顺序

5. 返回值

3. 代码编写

写在最后:


动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划! 

1. 题目解析

题目链接:1567. 乘积为正数的最长子数组长度 - 力扣(LeetCode)

题目非常好懂就是返回乘积是正数的最长子数组的长度。

2. 算法原理

1. 状态表示

还是分成两种状态表示,

f [ i ] 表示以 i 位置为结尾的所有子数组中乘积为正数的最长长度

g [ i ] 表示以 i 位置为结尾的所有子数组中乘积为负数的最长长度

2. 状态转移方程

我们先来分析一下 f [ i ] 的情况:

当 f [ i ] 只选择自己的时候,如果 nums[ i ] > 0 长度就是 1 否则就是 0。

当 f [ i ] 选择加上后面的值的时候,如果 nums[ i ] > 0,长度就是 f [ i - 1 ] + 1

如果 nums[ i ] < 0 ,那么这个时候的长度就是 g [ i - 1 ] == 0 ? 0 : g [ i - 1 ] + 1

所以 f [ i ] 的状态转移方程就是:

当  nums[ i ] > 0,f [ i ] = f [ i - 1 ] + 1

当 nums[ i ] < 0,f [ i ] = g [ i - 1 ] == 0 ? 0 : g [ i - 1 ] + 1

我们再来分析 g [ i ] 的情况,

当 f [ i ] 只选择自己的时候,如果 nums[ i ] > 0 长度就是 0 否则就是 1。

当 f [ i ] 选择加上后面的值的时候,如果 nums[ i ] < 0,长度就是 f [ i - 1 ] + 1

如果 nums[ i ] > 0 ,那么这个时候的长度就是 g [ i - 1 ] == 0 ? 0 : g [ i - 1 ] + 1

所以 g [ i ] 的状态转移方程就是:

当  nums[ i ] > 0,g [ i ] = g [ i - 1 ] == 0 ? 0 : g [ i - 1 ] + 1

当 nums[ i ] < 0,g [ i ] = f [ i - 1 ] + 1

3. 初始化

我们分析一下就能得出,把前面的虚拟节点初始化成 0 即可(也就是不用管)

4. 填表顺序

从左往右,两个表同时填写。

5. 返回值

我们应该返回 f 表中的最大值。

3. 代码编写

class Solution {
public:int getMaxLen(vector<int>& nums) {int n = nums.size();vector<int> f(n + 1);auto g = f;int ans = INT_MIN;for(int i = 1; i <= n; i++) {if(nums[i - 1] > 0) {f[i] = f[i - 1]  + 1;g[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;}else if(nums[i - 1] < 0) {f[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;g[i] = f[i - 1]  + 1;}ans = max(ans, f[i]);}return ans;}
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

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

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

相关文章

《系统架构设计师教程》重点章节思维导图

内容来自《系统架构设计师教程》&#xff0c;筛选系统架构设计师考试中分值重点分布的章节&#xff0c;根据章节的内容整理出相关思维导图。 重点章节 第2章&#xff1a;计算机系统知识第5章&#xff1a;软件工程基础知识第7章&#xff1a;系统架构设计基础知识第8章&#xff1…

常见程序搜索关键字转码

个别搜索类的网站因为用户恶意搜索出现误拦截情况&#xff0c;这类网站本身没有非法信息&#xff0c;只是因为把搜索关键字显示在网页中&#xff08;如下图&#xff09;&#xff0c;可以参考下面方法对输出的关键字进行转码 DEDECMS程序 本文针对Dedecms程序进行搜索转码&…

XXL-JOB任务调度平台的安装使用教程

首先从GitHub上面将项目clone下来。 GitHub地址&#xff1a;https://gitee.com/xuxueli0323/xxl-job.git 下载好之后&#xff0c;然后通过IDEA打开&#xff0c;将Maven编译好后项目结构如下 在数据库中运行这个SQL文件 &#xff0c;将基础表创建出来。就可以得到左边图中那些表…

复合 类型

字符串和切片 切片 切片的作用是允许你引用集合中部分连续的元素序列&#xff0c;而不是引用整个集合。 例如&#xff1a; let s String::from("hello world");let hello &s[0..5]; // 切片 [0,5) 等效于&s[..5] let world &s[6..11]; // 切片…

电脑缺失msvcp140.dll怎么办?解决msvcp140.dll缺失问题

msvcp140.dll是Microsoft Visual C Redistributable中的一个动态链接库文件&#xff0c;用于提供运行时支持。它的主要作用是为应用程序提供必要的函数和组件&#xff0c;以便在运行时执行特定的任务。当系统中缺少msvcp140.dll文件时&#xff0c;我们打开游戏或许软件时候就会…

Wordcloud | 风中有朵雨做的‘词云‘哦!~

1写在前面 今天可算把key搞好了&#xff0c;不得不说&#x1f3e5;里手握生杀大权的人&#xff0c;都在自己的能力范围内尽可能的难为你。&#x1f602; 我等小大夫也是很无奈&#xff0c;毕竟奔波霸、霸波奔是要去抓唐僧的。 &#x1f910; 好吧&#xff0c;今天是词云&#x…

使用selenium如何实现自动登录

回顾使用requests如何实现自动登录一文中&#xff0c;提到好多网站在我们登录过后&#xff0c;在之后的某段时间内访问该网页时&#xff0c;不会给出请登录的提示&#xff0c;时间到期后就会提示请登录&#xff01;这样在使用爬虫访问网页时还要登录&#xff0c;打乱我们的节奏…

【BASH】回顾与知识点梳理(二十七)

【BASH】回顾与知识点梳理 二十七 二十七. 磁盘配额(Quota)27.1 磁盘配额 (Quota) 的应用与实作什么是 QuotaQuota 的一般用途Quota 的使用限制Quota 的规范设定项目 27.2 一个 XFS 文件系统的 Quota 实作范例实作 Quota 流程&#xff1a;设定账号实作 Quota 流程-1&#xff1a…

Python random模块用法整理

随机数在计算机科学领域扮演着重要的角色&#xff0c;用于模拟真实世界的随机性、数据生成、密码学等多个领域。Python 中的 random 模块提供了丰富的随机数生成功能&#xff0c;本文整理了 random 模块的使用。 文章目录 Python random 模块注意事项Python random 模块的内置…

用AI攻克“智能文字识别创新赛题”,这场大学生竞赛掀起了什么风潮?

文章目录 一、前言1.1 大赛介绍1.2 项目背景 二、基于智能文字场景个人财务管理创新应用2.1 作品方向2.2 票据识别模型2.2.1 文本卷积神经网络TextCNN2.2.2 Bert 预训练微调2.2.3 模型对比2.2.4 效果展示 2.3 票据文字识别接口 三、未来展望 一、前言 1.1 大赛介绍 中国大学生…

时序预测-Informer简介

文章目录 Informer介绍1. Transformer存在的问题2. Informer研究背景3. Informer 整体架构3.1 ProbSparse Self-attention3.2 Self-attention Distilling3.3 Generative Style Decoder 4. Informer的实验性能5. 相关资料 Informer介绍 1. Transformer存在的问题 Informer实质…

网络套接字

网络套接字 文章目录 网络套接字认识端口号初识TCP协议初识UDP协议网络字节序 socket编程接口socket创建socket文件描述符bind绑定端口号sockaddr结构体netstat -nuap&#xff1a;查看服务器网络信息 代码编译运行展示 实现简单UDP服务器开发 认识端口号 端口号(port)是传输层协…

【Linux】ICMP协议——网络层

ICMP协议 ICMP&#xff08;Internet Control Message Protoco&#xff09;Internet控制报文协议&#xff0c;用于在IP主机、路由器之间传递控制信息&#xff0c;是一个TCP/IP协议。该协议是用来检测网络传输的问题&#xff0c;相当于维修人员的工具。 ICMP协议的定位 在TCP/IP…

Aspera替代方案:探索这些安全且可靠的文件传输工具

科技的发展日新月异&#xff0c;文件的传输方式也在不断地更新换代。传统的邮件附件、FTP等方式已经难以满足人们对于传输速度和安全性的需求了。近年来&#xff0c;一些新兴的文件传输工具受到了人们的关注&#xff0c;其中除了知名的Aspera之外&#xff0c;还有许多可靠安全的…

简绘ChatGPT支持Midjourney绘图 支持stable diffusion绘图

简绘支持Midjourney绘图和stable diffusion绘图。 这意味着简绘具备Midjourney绘图和stable diffusion绘图功能的支持。

CSS自学框架之表单

首先我们看一下表单样式&#xff0c;下面共有5张截图 一、CSS代码 /*表单*/fieldset{border: none;margin-bottom: 2em;}fieldset > *{ margin-bottom: 1em }fieldset:last-child{ margin-bottom: 0 }fieldset legend{ margin: 0 0 1em }/* legend标签是CSS中用于定义…

《qt quick核心编程》笔记四

11 Model/View Delegate实际上可以看成是Item的一个模板 11.1 ListView ListView用于显示一个条目列表&#xff0c;数据来自于Model&#xff0c;每个条目的外观来自于Delegate 要使用ListView必须指定一个Model、一个Delegate Model可以是QML内建类型&#xff0c;如ListModel…

QGraphicsView实现简易地图6『异步加载-无底图』

前文链接&#xff1a;QGraphicsView实现简易地图5『经纬网格』 同步加载&#xff0c;虽然程序已做到最少瓦片加载&#xff0c;但或多或少都存在一定程度上的卡顿现象&#xff0c;或者说是不够流畅吧。因此尝试采用异步加载&#xff0c;大致思路是每次缩放或漫游时计算所需重新加…

服务器如何防止cc攻击

对于搭载网站运行的服务器来说&#xff0c;cc攻击应该并不陌生&#xff0c;特别是cc攻击的攻击门槛非常低&#xff0c;有个代理IP工具&#xff0c;有个cc攻击软件就可以轻易对任何网站发起攻击&#xff0c;那么服务器如何防止cc攻击?请看下面的介绍。 服务器如何防止cc攻击&a…

K8S系列文章之 Docker安装使用Kafka

通过Docker拉取镜像的方式进行安装 照例先去DockerHub找一下镜像源&#xff0c;看下官方提供的基本操作&#xff08;大部分时候官方教程比网上的要清晰一些&#xff0c;并且大部分教程可能也是翻译的官方的操作步骤&#xff0c;所以直接看官方的就行&#xff09; 老实说Kafka…