输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正整,应输出-1(表示无解)。1≤n≤18,-10≤Si≤10。
样例输入:
3
2 4-3
5
2 5-1 2 -1
样例输出:
8
20
【分析】
连续子序列有两个要素:起点和终点,因此只需要枚举起点和终点即可。由于每个元素的绝对值不超过10,一共又不超过18个元素,最大可能的乘积示会超过1018,可以用long long存下。
完整的程序如下:
#include<iostream> #include<string.h> #include<stdio.h> #include<ctype.h> #include<algorithm> #include<stack> #include<queue> #include<math.h> using namespace std; int a[30]; int i,j; int main() { int n; int w; long long ans; while(scanf("%d",&n)!=EOF) { for(i=0; i<n; i++) scanf("%d",&a[i]); ans=0; for(i=0; i<n; i++) { w=1; for(j=0; j<n; j++) { w*=a[j]; if(w>ans) ans=w; } } if(ans>=0) printf("%d\n",ans); else printf("-1\n"); } return 0; }