#include<stdio.h>
int max(int a, int b)
{
int max_num;
return (a>b ? a:b);
}
int maxSubArrayProd(int a[], int size)
{
int max_so_far = 1;
int i;
//stores number of negative entries
int num_of_neg=0;
//stores first negative entries if any
int first_neg;
//stores last negative entries if any
int last_neg;
int prod_so_far_right_of_last_neg=1;
int prod_so_far_left_for_first_neg=1;
int prod_so_far_left=1;
int prod_so_far_right=1;
int prod_so_far_middle=1;
int prod_right_of_last_neg=1;
int prod_left_of_last_neg=1;
int prod_left_of_first_neg=1;
int prod_right_of_first_neg=1;
for(i = 0; i < size; i++)
{
if (a[i] < 0)
{
if (num_of_neg == 0) {
first_neg = i;
}
num_of_neg++;
last_neg = i;
}
}
if ((num_of_neg%2 == 0) || (num_of_neg == 0)) {
//multiply all
for(i = 0; i < size; i++)
{
max_so_far *= a[i];
}
return max_so_far;
} else if (num_of_neg == 1) {
//only one negative number
//find prod of left and write numbers
for(i = 0; i < first_neg; i++)
{
prod_so_far_left *= a[i];
}
for(i = first_neg+1; i < size; i++)
{
prod_so_far_right *= a[i];
}
return max(prod_so_far_left, prod_so_far_right);
} else {
//more than one odd negative numbers
for(i = 0; i < first_neg; i++)
{
prod_so_far_left_for_first_neg *= a[i];
}
for(i = first_neg+1; i < last_neg; i++)
{
prod_so_far_middle *= a[i];
}
for(i = last_neg+1; i < size; i++)
{
prod_so_far_right_of_last_neg *= a[i];
}
prod_left_of_first_neg = prod_so_far_left_for_first_neg;
prod_right_of_first_neg = prod_so_far_middle * prod_so_far_right_of_last_neg * a[last_neg];
prod_left_of_last_neg = prod_so_far_left_for_first_neg * a[first_neg] * prod_so_far_middle;
prod_right_of_last_neg = prod_so_far_right_of_last_neg;
return (max(max(prod_right_of_last_neg, prod_left_of_last_neg),
max(prod_right_of_first_neg, prod_left_of_first_neg)));
}
}
/*Driver program to test maxSubArraySum*/
int main()
{
int a[] = {-2, -3, 4, 0, -2, 1, 5, -3};
int max_prod = maxSubArrayProd(a, 8);
printf("Maximum contiguous prod is %d\n", max_prod
); return 0;
}