题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/B
题意:
输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0(表示无解)。1<=n<=18,-10<=si<=10.每个案例要用空格隔开。
案例:
input
3
2 4 -3
5
2 5 -1 2 -1
output
Case #1:The maximum product is 8.
Case #2:The maximum product is 20.
思路分析:
连续子序列有两个要素:起点和终点,因此只需枚举起点和终点即可。
只要给最大值赋初值0,大于0才给最大值重新赋值,则任何负数最后输出都会为0,不需分开考虑。
注意:最大值要用long long类。
源代码如下:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int main() 5 { 6 int N,n=0,i; 7 long long maxn,x; 8 while(scanf("%d",&N)!=EOF) 9 { 10 n++; 11 int s[20]; 12 for(i=0;i<N;i++) 13 cin>>s[i]; 14 maxn=0; 15 for(i=0;i<N;i++) //起点 16 { 17 for(int j=i;j<N;j++) //终点 18 { 19 x=1; 20 for(int k=i;k<=j;k++) 21 x*=s[k]; 22 if(x>maxn) //找出最大值 23 maxn=x; 24 } 25 } 26 printf("Case #%d: The maximum product is %lld. ",n,maxn); 27 } 28 return 0; 29 }