0
点赞
收藏
分享

微信扫一扫

DP7 连续子数组的最大乘积

小猪肥 2022-04-18 阅读 260
c++

描述

输入一个长度为 n 的整型数组 nums,数组中的一个或连续多个整数组成一个子数组。求所有子数组的乘积的最大值。

1.子数组是连续的,且最小长度为 1 ,最大长度为 n

2.长度为 1 的子数组,乘积视为其本身,比如 [4] 的乘积为 4

3.该题的数据保证最大的乘积不会超过 int 的范围,即不超过2^{32}-1232−1

数据范围:

1 <= n <= 2\times10^51<=n<=2×105

-100 <= a[i] <= 100−100<=a[i]<=100

输入描述:

第一行输入一个正整数 n ,表示数组的长度

第二行输入 n 个整数,表示数组中的值。

输出描述:

输出子数组的乘积的最大值

示例1

输入:

4
3 2 -2 4

复制输出:

6

复制说明:

子数组[3,2]的乘积为6,[3,2,-1,4]的乘积为-24,[4]的乘积为4,故返回6

示例2

输入:

3
-3 0 -2

复制输出:

0

复制说明:

因为0在中间,所有包含0的子数组的乘积都为0,另外的数都是负数,所以最大乘积的子数组为[0],返回为0,因为子数组要求是连续的,所以[-3,-2]不是[-3,0,-2]的子数组,所以不能为6,

示例3

输入:

3
-3 2 -2

复制输出:

12

思路:

乘法和加法其实思路是差不多的,只不过需考虑:1、当sum<0时,sum/负数的最大值;2、当sum==0时,要更使sum=1,更新复数最大值Fmax=0;

#include<stdio.h>
int a[200005];
#define infMax 2e8

int main()
{
    int n;
    scanf("%d",&n);
     int Max=-infMax;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]>Max)
        {
            Max=a[i];
        }
    }
    
    int Fmax=0;
   
    int sum=1;
    for(int i=1;i<=n;i++)
    {
        sum=sum*a[i];
        if(sum==0)
        {
            if(Max<0)
            {
                Max=0;
            }
            sum=1;
            Fmax=0;
            continue;
        }
        if(sum!=0)
        {
            if(sum>0)
            {
                int x=sum;
                if(x>Max)
                {
                    Max=x;
                }
                
              
            }
            
            else if(sum<0 && Fmax!=0)
            {
                int x=sum/Fmax;
                if(x>Max)
                {
                     Max=x;
                }
                
                
            }
             
               if(sum<0)
               {
                   if(Fmax==0)
                   {
                       Fmax=sum;
                   }
                   else{
                       if(sum>Fmax)
                       {
                           Fmax=sum;
                       }
                   }
                   
               }
            
        }
           
        
    }
    printf("%d\n",Max);
    return 0;
}

举报

相关推荐

0 条评论