给定一个整数序列(可能有正数,0和负数),求它的一个连续最大子序列乘积,如果乘积为负数,输出-1
样例输入:
3
2 4 -3
5
2 5 -1 2 -1
样例输出:
8
20
连续子序列有俩个要素,起点和终点,因此只需要枚举起点和终点即可,由于每个元素的绝对值不超过10,一共不超过18个元素,最大可能的成绩不会超过10^18,可以用long long存下。暴力枚举
/* * 这个枚举,是沿着数组逐步向下走,依次相加,不排除负数的可能依次相加 * 枚举出所有的情况 */ #include<stdio.h> int main(){ int n,s[18]={0},result[3000]={0},count=0,min; while(scanf("%d",&n)==1){ for(int f=0;f<n;f++){ scanf("%d",&s[f]); } //在数组中不断的枚举 for(int i=0;i<n;i++){ result[count]=s[i]; //不排除负数,一个一个向后加。 //找出所有可能性 for(int j=i+1;j<n;j++){ count++; result[j]=result[j-1]+s[j]; } count++; } //选择出数组中所有数的最小值 min=result[0]; for(int x=1;x<count;x++){ min=(min<result[x])?result[x]:min; } if(min<0) printf("-1 "); else printf("%d ",min); } return 0; }