【动态规划刷题 10】最大子数组和 III && 环形子数组的最大和

简介: 【动态规划刷题 10】最大子数组和 III && 环形子数组的最大和

152. 乘积最大子数组

链接: 152. 乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。


测试用例的答案是一个 32-位 整数。


子数组 是数组的连续子序列。


示例 1:


输入: nums = [2,3,-2,4]

输出: 6

解释: 子数组 [2,3] 有最大乘积 6。

示例 2:


输入: nums = [-2,0,-1]

输出: 0

解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。


1.状态表示*

定义两个状态表示:


f[i] 表⽰:以 i 结尾的所有⼦数组的最⼤乘积。

g[i] 表⽰:以 i 结尾的所有⼦数组的最⼩乘积。


2.状态转移方程


遍历每⼀个位置的时候,我们要同步更新两个 dp 数组的值。

对于 f[i] ,也就是「以 i 为结尾的所有⼦数组的最⼤乘积」,对于所有⼦数组,可以分为:

  1. 当nums[i]>0 时, f[i]=max(f[i-1]*nums[i],nums[i]);
  2. 当nums[i]<0时,f[i]=g[i-1]*nums[i];

对于g[i],也就是「以 i 为结尾的所有⼦数组的最小乘积」,可以分为:

  1. 当nums[i]>0 时, g[i]=g[i-1]*nums[i];
  2. 当nums[i]<0时,g[i]=min(f[i-1]*nums[i],nums[i]);

3. 初始化

对于这些初始化较为简单的题,没有添加辅助节点,直接进行初始化

        f[0]=nums[0]>0?nums[0]:0;
        g[0]=nums[0]>0?0:nums[0];

4. 填表顺序

根据「状态转移⽅程」易得,填表顺序为「从左往右」,其两个表一起填写

5. 返回值

返回f[]表中的最大值

代码:

 int maxProduct(vector<int>& nums) {
        int n=nums.size();
        //f表示乘积最大子数组的乘积
        //g表示乘积最小子数组的乘积
        vector<int> f(n),g(n);
        int Max=nums[0];
        f[0]=nums[0]>0?nums[0]:0;
        g[0]=nums[0]>0?0:nums[0];
        for(int i=1;i<n;i++)
        {
            if(nums[i]>0)
            {
                f[i]=max(f[i-1]*nums[i],nums[i]);
                g[i]=g[i-1]*nums[i];
            }
            if(nums[i]<0)
            {
                f[i]=g[i-1]*nums[i];
                g[i]=min(f[i-1]*nums[i],nums[i]);
            }
           // cout<<f[i]<<" "<<g[i]<<endl;
            Max=max(Max,f[i]);
        }
        return Max;                                                   
    }

1567. 乘积为正数的最长子数组长度

链接: 1567. 乘积为正数的最长子数组长度

给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。

一个数组的子数组是由原数组中零个或者更多个连数组。


请你返回乘积为正数的最长子数组长度。


示例 1:


输入:nums = [1,-2,-3,4]

输出:4

解释:数组本身乘积就是正数,值为 24 。

示例 2:


输入:nums = [0,1,-2,-3,-4]

输出:3

解释:最长乘积为正数的子数组为 [1,-2,-3] ,乘积为 6 。

注意,我们不能把 0 也包括到子数组中,因为这样乘积为 0 ,不是正数。

示例 3:


输入:nums = [-1,-2,-3,0,1]

输出:2

解释:乘积为正数的最长子数组是 [-1,-2] 或者 [-2,-3] 。


1.状态表示*

定义两个状态表示:


f[i] 表⽰:以 i 结尾的所有⼦数组的乘积为正数的最长子数组长度。

g[i] 表⽰:以 i 结尾的所有⼦数组的乘积为负数的最长子数组长度。


2.状态转移方程


遍历每⼀个位置的时候,我们要同步更新两个 dp 数组的值。

对于 f[i] ,也就是「以 i 结尾的所有⼦数组的乘积为正数的最长子数组长度」,对于所有⼦数组,可以分为:

  1. 当nums[i]>0 时, f[i]=f[i-1]+1;
  2. 当nums[i]<0时,f[i]=g[i-1]==0?0:g[i-1]+1;

对于g[i],也就是「以 i 为结尾的所有⼦数组的最小乘积」,可以分为:

  1. 当nums[i]>0 时, g[i]=g[i-1]==0?0:g[i-1]+1;
  2. 当nums[i]<0时,g[i]=f[i-1]+1;

3. 初始化

对于这些初始化较为简单的题,没有添加辅助节点,直接进行初始化

         if(nums[0]>0) f[0]=1;
        else if(nums[0]<0) g[0]=1;

4. 填表顺序

根据「状态转移⽅程」易得,填表顺序为「从左往右」,其两个表一起填写

5. 返回值

返回f[]表中的最大值

代码:

 int getMaxLen(vector<int>& nums) {
        int n=nums.size();
        //以 i位置为最后一个位置时
        //f[] 表示的正,g[]表示的是负
        vector<int> f(n),g(n);
        if(n==1)
        {
            if(nums[0]>0) return 1;
            else return 0;
        }
        if(nums[0]>0) f[0]=1;
        else if(nums[0]<0) g[0]=1;
        int Max=0;
        for(int i=1;i<n;i++)
        {
            if(nums[i]>0)
            {
                f[i]=f[i-1]+1;
                g[i]=g[i-1]==0?0:g[i-1]+1;
            }
            if(nums[i]<0)
            {
                f[i]=g[i-1]==0?0:g[i-1]+1;
                g[i]=f[i-1]+1;
            }
            if(nums[i]==0)
            {
                f[i]=g[i]=0;
            }
            Max=max(Max,f[i]);
        }
        return Max;
    }
相关文章
|
存储 算法 数据安全/隐私保护
从零开始搭建群众权益平台(三)
从零开始搭建群众权益平台(三)
194 0
|
存储 缓存 安全
java之路 —— 带你了解安全框架Shiro
java之路 —— 带你了解安全框架Shiro
437 0
|
SQL 关系型数据库 MySQL
Mysql过滤分组
Mysql过滤分组
206 0
|
18天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
8727 25
|
17天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
3279 14
|
17天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2167 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
6天前
|
人工智能 JSON Linux
【全网最详细】ComfyUI使用教程:下载+本地部署+配置+工作流搭建一篇搞定(2026最新版)
ComfyUI是一款免费开源的本地AI绘图工具,采用节点式工作流设计,支持文生图、图生图、局部重绘、放大、换脸等多种功能。可离线运行,依赖显卡加速,无需联网。支持自定义流程保存与分享,插件生态丰富,适合进阶用户。(239字)
|
11天前
|
人工智能 Linux 开发者
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
Codex是OpenAI推出的AI编程智能体,可读取本地项目、理解需求并自动修改代码。支持桌面GUI、命令行(CLI)及VS Code/Cursor插件三种形态,覆盖可视化操作、终端高效开发与编辑器无缝集成场景,助开发者用自然语言驱动编码全流程。(239字)
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
|
17天前
|
云安全 人工智能 安全