题意
求连续乘积最大值
思路
连续子序列有两个要素:起点和终点,因此只需枚举起点和终点即可。由于每个元素的绝对值不超过10且不超过18个元素,最大可能的乘积不会超过10181018,可以用long long存储
对负数的特殊处理 :
如果遇到乘完某负数后结果变为负数,则应该搜索该遍历区间后面的数还有几个负数,如果没有剩余的负数了( mm == 0 ),之后的乘积一定是负数,也就没有必要继续往后遍历的必要了
AC代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define maxn 1000 + 10
int s[maxn];
int main()
{
int n, num = 0;
while( ~scanf("%d",&n) )
{
for( int i = 0 ; i < n ; i++ )
scanf("%d",&s[i]);
long long a, cheng = s[0];
for( int i = 0 ; i < n ; i++ )
{
int dx = 1;
a = s[i];
cheng = a > cheng ? a : cheng;
int mm = 0; //记录尚未遍历的数中还有多少负数
for( int j = i+1 ; j < j + dx && j < n ; j++ )
{
a *= s[j];
if( a < 0 && s[j] < 0 )
{
for( int k = j ; k < j + dx && k < n; k++ )
mm++;
if( mm == 0 ){
cheng = a/s[j];
break;
}
}
cheng = a > cheng ? a : cheng;
dx++;
}
}
cheng = cheng < 0 ? 0 : cheng;
printf("Case #%d: The maximum product is %lld.\n\n",++num, cheng);
}
return 0;
}