题意简概:
输入n个元素组成的序列S,你需要找一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0,表示无解。1<=n<=18,-10<=Si<=10。
Sample Input
3
2 4 -3
5
2 5 -1 2 -1
Sample Output
Case #1: The maximum product is 8.
Case #2: The maximum product is 20.
简单分析:
连续子序列有两个要素:起点和终点。因此只要枚举起点和终点即可。由于每个元素的绝对值不超过10且不超18个元素,最大可能的乘积不会超过10^18,用long long 型存储。
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int a[18]; 5 6 int main() 7 { 8 int n,x=0; 9 while(scanf("%d",&n)!=EOF && n>=1 && n<=18) 10 { 11 int i,j; 12 int maxn=0; 13 for(i=0;i<n;i++) 14 scanf("%d",&a[i]); 15 16 for(i=0;i<n;i++) 17 { 18 int k=1; //注意k的位置。每次子序列起点换了时都要重新赋值为1 19 for(j=i;j<n;j++) 20 { 21 k*=a[j]; 22 if(k>maxn) 23 maxn=k; //maxn一直保存当前最大值。 24 } 25 } 26 x++; 27 printf("Case #%d: The maximum product is %d.\n\n",x,maxn); 28 29 } 30 31 return 0; 32 33 }
尤其注意输出答案,例如Case的首字母大写,单词间的空格。
时间: 2024-10-03 13:06:56