題目鏈接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/B
題意:
輸入n個元素組成的序列S,找出一個乘積最大的連續子序列。如果這個最大的乘積不是正數,輸出0(表示無解)。1<=n<=18,-10<=Si<=10。每一個案例之間用空白行分隔,案例輸出要求輸出"Case #M: The maximum product is P.",其中M為案例號,P為乘積值。
案例:
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.
分析:
連續的子序列有兩個要素,即起點和終點,因此只需枚舉起點和終點即可,由於至多18個元素且絕對值不超過10,最大乘積不超過10的18次方,可以使用long long型存儲。
源代碼:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int maxn=20; 5 int a[maxn]; 6 int main() 7 { 8 int N,i,j,t,ant=0; 9 long long k,max;//注意輸入18位數全為10時,k和max數據過大 10 while(scanf("%d",&N)!=EOF)//數據量 11 { 12 ant++; 13 for(i=0;i<N;i++)//數據 14 cin>>a[i]; 15 max=0;//最大乘積值 16 for(i=0;i<N;++i)//起始位置 17 { 18 for(j=i;j<N;j++)//結束點位置 19 { k=1; 20 for(t=i;t<=j;t++)//起點至終點數據乘積 21 k*=a[t]; 22 if(max<k)//最大乘積值判斷 23 max=k; 24 } 25 } 26 printf("Case #%d: The maximum product is %lld.\n",ant,max);//輸出語句控制 27 if(ant) cout<<endl; 28 } 29 return 0; 30 }
