算法竞赛 例题7-2 最大乘积

题目要求:
输入n个元素组成的序列s,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0。1<=n<=18,-10<=Si<=10。
样例输入:
3
2 4 -3
5
2 5 -1 2 -1
样例输出:
8
20

分析: 连续子序列有两个要素:起点和终点,因此只需枚举起点和终点即可。%I64d输出long long类型数字。

代码:

#include 
#include 
using namespace std;
#define LL long long
int main()
{
    int n;
    int a[20];
   while(scanf("%d",&n)==1){
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    LL maxn=0;
    for(int i=0;i<n;i++){
        LL sum=1;
        for(int j=i;j<n;j++){
            sum=sum*a[j];
            if(sum>maxn)
                maxn=sum;
        }
    }
    if(maxn<0)
       maxn=0;
    printf("%I64d\n",maxn);
   }
    return 0;
}

结果:
算法竞赛 例题7-2 最大乘积_第1张图片
代码中LL sum=1,不仅仅只是定义sum初始值的作用,如果把它放到for循环外,那么就算sum<0,再重新寻找子序列的时候,sum也不会为1,而是继续以得出来的负值进行下一步计算,但是把它放在一层for循环中,在每次重新寻找子序列时都会回到初始值1。我刚开始就是因为没有把sum=1放入for循环中,导致一直出错,改了很多遍也不行。谨记!

你可能感兴趣的:(算法竞赛例题,算法,c++)