【动态规划专栏】专题四:子数组问题--------最大子数组和&&环形子数组的最大和1

简介: 【动态规划专栏】专题四:子数组问题--------最大子数组和&&环形子数组的最大和1


题目一来源

本题来源为:

Leetcode152. 乘积最大子数组

题目一描述

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

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

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

算法原理

1.状态表示

经验+题目要求

对于本题而言就是:

f[i]表示:以i位置为结尾时的所有子数组中的最大乘积
g[i]表示:以i位置为结尾时的所有子数组中的最小乘积

2.状态转移方程

因此状态方程为:

int x=nums[i-1];
int y=f[i-1] * nums[i-1];
int z=g[i-1]* nums[i -1];
f[i]= max(x,max(y,z));
g[i]=min(x,min(y,z));
ret=max(ret,f[i]);

3.初始化

4.填表顺序

从左往右,两个表一起填

5.返回值

f表里的最大值

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution 
{
public:
    int maxProduct(vector<int>& nums) 
    {
         //创建dp表
        int n=nums.size();
        vector<int> f(n+1);
        vector<int> g(n+1);
        //初始化
        f[0]=g[0]=1;
        //填表
        int ret=INT_MIN;
       for(int i=1;i<=n;i++)
       {
           int x=nums[i-1];
           int y=f[i-1] * nums[i-1];
           int z=g[i-1]* nums[i -1];
           f[i]= max(x,max(y,z));
           g[i]=min(x,min(y,z));
           ret=max(ret,f[i]);
       }
        //返回值
        return ret;
    }
};

题目二来源

本题来源为:

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

题目二描述

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

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

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

算法原理

1.状态表示

经验+题目要求

对于本题而言就是:

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

2.状态转移方程

因此状态方程为:

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;
    }
ret=max(ret,f[i]);

3.初始化

4.填表顺序

从左往右,两个表一起填

5.返回值

f表里面的最大值

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution 
{
public:
    int getMaxLen(vector<int>& nums) 
    {
        int n=nums.size();
        //创建dp表
        vector<int> f(n+1);
        vector<int> g(n+1);
        int ret=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;
            }
            ret=max(ret,f[i]);
        }
        //返回值
        return ret;
    }
};
相关文章
|
4天前
|
云安全 人工智能 自然语言处理
|
8天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
800 17
|
11天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
803 59
Meta SAM3开源:让图像分割,听懂你的话
|
2天前
|
人工智能 安全 小程序
阿里云无影云电脑是什么?最新收费价格个人版、企业版和商业版无影云电脑收费价格
阿里云无影云电脑是运行在云端的虚拟电脑,分企业版和个人版。企业版适用于办公、设计等场景,4核8G配置低至199元/年;个人版适合游戏、娱乐,黄金款14元/月起。支持多端接入,灵活按需使用。
235 164
|
9天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
335 116
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
364 3

热门文章

最新文章