Re: [algogeeks] max product of a subarray

2011-08-05 Thread Arun Vishwanathan
my wrong I guess yr 3rd point takes care of this...
apologies

On Fri, Aug 5, 2011 at 11:03 AM, Arun Vishwanathan
wrote:

> it is difficult to read code and understand but based on the logic u
> mentioned in 3 points i just want to know if u also have taken care of the
> case where
> u have zero points in the array and as u say find each product around 0
> points, do u check within each subarray around the zero point if the number
> of negative numbers is even or odd there? in case u have cool but it takes
> time to sit and understand someone else's code hence am just asking
>
> On Thu, Aug 4, 2011 at 5:58 PM, Thayumanavar S wrote:
>
>> > given an array containing +ve n -ve numbers , can someone give
>> > efficient algo to find the max cont subarray product.
>>
>> this is same as problem http://online-judge.uva.es/p/v110/11059.html.
>> here is the code for this one:
>> #include 
>> #include 
>> #include 
>> #include 
>> using namespace std;
>> /* Algorithm:
>>1. if there is no zero in the array, the number of negative
>> number is even,
>>   max product would be product of all numbers.
>>2. so we partition array around zero points and calculate each
>> subarray max product
>>   and max product would be the subarray which has max value among
>> this.
>>3. if in the subarray, the number of negative number is odd,
>> then we need to leave out
>>   -ve number either on left or right depending on which has
>> lesser absolute value.
>> */
>>
>> long long int
>> submaxproduct(int *a, int start, int end);
>> long long int
>> maxprod(int *a, int n)
>> {
>>
>>long long int maxprod = INT_MIN;
>>long long int maxarrprod = 0;
>>int start=0,i;
>>if ( a == NULL ||  n == 0 ) return 0;
>>for ( i = 0; i < n; i++ ) {
>>if ( a[i] == 0 ) {
>>if ( i != 0 && a[i-1] != 0 ) { maxarrprod =
>> submaxproduct(a, start, i-1);
>>if ( maxarrprod > maxprod )
>>maxprod = maxarrprod; }
>>start = i+1;
>>}
>>else if ( i == n-1 ) {
>>maxarrprod = submaxproduct(a, start, i);
>>if ( maxarrprod > maxprod )
>>maxprod = maxarrprod;
>>}
>>}
>>if ( maxprod < 0 ) maxprod = 0;
>>return maxprod;
>> }
>> long long int
>> submaxproduct(int *a, int start, int end)
>> {
>>int lprod=1,rprod=1;
>>int lneg=0,rneg=0;
>>long long int mprod=1;
>>int count=0;
>>int i;
>>for ( i = start; i<=end;i++ )
>>{
>>mprod *= a[i];
>>if ( a[i] > 0 && lneg == 0 )
>>lprod *= a[i];
>>else if ( a[i]>0 && rneg != 0 )
>>rprod *= a[i];
>>else if ( a[i] < 0 && lneg != 0 ) {
>>count++;
>>rneg = a[i];
>>rprod = 1;
>>}
>>else if ( a[i] < 0 ) {
>>count++;
>>lneg = rneg = a[i];
>>}
>>}
>>if ( ( count > 0 && (end-start) == 0) || count%2 == 0 )
>>return mprod;
>>else {
>>long long int maxf = max(rneg*rprod,lneg*lprod);
>>return mprod/maxf;
>>}
>> }
>> int
>> main()
>> {
>>int n;
>>int count = 1;
>>int i;
>>while ( cin>>n ) {
>>int a[n];
>>for ( i = 0; i < n; i++ ) {
>>cin >>a[i];
>>}
>>printf("Case #%d: The maximum product is
>> %lld.",count++,maxprod(a,n));
>>printf("\n\n");
>>}
>>
>>return 0;
>> }
>>
>>
>> thayumanavar s
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Algorithm Geeks" group.
>> To post to this group, send email to algogeeks@googlegroups.com.
>> To unsubscribe from this group, send email to
>> algogeeks+unsubscr...@googlegroups.com.
>> For more options, visit this group at
>> http://groups.google.com/group/algogeeks?hl=en.
>>
>>
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to algogeeks@googlegroups.com.
To unsubscribe from this group, send email to 
algogeeks+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.



Re: [algogeeks] max product of a subarray

2011-08-05 Thread Arun Vishwanathan
it is difficult to read code and understand but based on the logic u
mentioned in 3 points i just want to know if u also have taken care of the
case where
u have zero points in the array and as u say find each product around 0
points, do u check within each subarray around the zero point if the number
of negative numbers is even or odd there? in case u have cool but it takes
time to sit and understand someone else's code hence am just asking

On Thu, Aug 4, 2011 at 5:58 PM, Thayumanavar S  wrote:

> > given an array containing +ve n -ve numbers , can someone give
> > efficient algo to find the max cont subarray product.
>
> this is same as problem http://online-judge.uva.es/p/v110/11059.html.
> here is the code for this one:
> #include 
> #include 
> #include 
> #include 
> using namespace std;
> /* Algorithm:
>1. if there is no zero in the array, the number of negative
> number is even,
>   max product would be product of all numbers.
>2. so we partition array around zero points and calculate each
> subarray max product
>   and max product would be the subarray which has max value among
> this.
>3. if in the subarray, the number of negative number is odd,
> then we need to leave out
>   -ve number either on left or right depending on which has
> lesser absolute value.
> */
>
> long long int
> submaxproduct(int *a, int start, int end);
> long long int
> maxprod(int *a, int n)
> {
>
>long long int maxprod = INT_MIN;
>long long int maxarrprod = 0;
>int start=0,i;
>if ( a == NULL ||  n == 0 ) return 0;
>for ( i = 0; i < n; i++ ) {
>if ( a[i] == 0 ) {
>if ( i != 0 && a[i-1] != 0 ) { maxarrprod =
> submaxproduct(a, start, i-1);
>if ( maxarrprod > maxprod )
>maxprod = maxarrprod; }
>start = i+1;
>}
>else if ( i == n-1 ) {
>maxarrprod = submaxproduct(a, start, i);
>if ( maxarrprod > maxprod )
>maxprod = maxarrprod;
>}
>}
>if ( maxprod < 0 ) maxprod = 0;
>return maxprod;
> }
> long long int
> submaxproduct(int *a, int start, int end)
> {
>int lprod=1,rprod=1;
>int lneg=0,rneg=0;
>long long int mprod=1;
>int count=0;
>int i;
>for ( i = start; i<=end;i++ )
>{
>mprod *= a[i];
>if ( a[i] > 0 && lneg == 0 )
>lprod *= a[i];
>else if ( a[i]>0 && rneg != 0 )
>rprod *= a[i];
>else if ( a[i] < 0 && lneg != 0 ) {
>count++;
>rneg = a[i];
>rprod = 1;
>}
>else if ( a[i] < 0 ) {
>count++;
>lneg = rneg = a[i];
>}
>}
>if ( ( count > 0 && (end-start) == 0) || count%2 == 0 )
>return mprod;
>else {
>long long int maxf = max(rneg*rprod,lneg*lprod);
>return mprod/maxf;
>}
> }
> int
> main()
> {
>int n;
>int count = 1;
>int i;
>while ( cin>>n ) {
>int a[n];
>for ( i = 0; i < n; i++ ) {
>cin >>a[i];
>}
>printf("Case #%d: The maximum product is
> %lld.",count++,maxprod(a,n));
>printf("\n\n");
>}
>
>return 0;
> }
>
>
> thayumanavar s
>
> --
> You received this message because you are subscribed to the Google Groups
> "Algorithm Geeks" group.
> To post to this group, send email to algogeeks@googlegroups.com.
> To unsubscribe from this group, send email to
> algogeeks+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/algogeeks?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to algogeeks@googlegroups.com.
To unsubscribe from this group, send email to 
algogeeks+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.



Re: [algogeeks] max product of a subarray

2011-08-04 Thread Thayumanavar S
> given an array containing +ve n -ve numbers , can someone give
> efficient algo to find the max cont subarray product.

this is same as problem http://online-judge.uva.es/p/v110/11059.html.
here is the code for this one:
#include 
#include 
#include 
#include 
using namespace std;
/* Algorithm:
1. if there is no zero in the array, the number of negative
number is even,
   max product would be product of all numbers.
2. so we partition array around zero points and calculate each
subarray max product
   and max product would be the subarray which has max value among this.
3. if in the subarray, the number of negative number is odd,
then we need to leave out
   -ve number either on left or right depending on which has
lesser absolute value.
*/

long long int
submaxproduct(int *a, int start, int end);
long long int
maxprod(int *a, int n)
{

long long int maxprod = INT_MIN;
long long int maxarrprod = 0;
int start=0,i;
if ( a == NULL ||  n == 0 ) return 0;
for ( i = 0; i < n; i++ ) {
if ( a[i] == 0 ) {
if ( i != 0 && a[i-1] != 0 ) { maxarrprod =
submaxproduct(a, start, i-1);
if ( maxarrprod > maxprod )
maxprod = maxarrprod; }
start = i+1;
}
else if ( i == n-1 ) {
maxarrprod = submaxproduct(a, start, i);
if ( maxarrprod > maxprod )
maxprod = maxarrprod;
}
}
if ( maxprod < 0 ) maxprod = 0;
return maxprod;
}
long long int
submaxproduct(int *a, int start, int end)
{
int lprod=1,rprod=1;
int lneg=0,rneg=0;
long long int mprod=1;
int count=0;
int i;
for ( i = start; i<=end;i++ )
{
mprod *= a[i];
if ( a[i] > 0 && lneg == 0 )
lprod *= a[i];
else if ( a[i]>0 && rneg != 0 )
rprod *= a[i];
else if ( a[i] < 0 && lneg != 0 ) {
count++;
rneg = a[i];
rprod = 1;
}
else if ( a[i] < 0 ) {
count++;
lneg = rneg = a[i];
}
}
if ( ( count > 0 && (end-start) == 0) || count%2 == 0 )
return mprod;
else {
long long int maxf = max(rneg*rprod,lneg*lprod);
return mprod/maxf;
}
}
int
main()
{
int n;
int count = 1;
int i;
while ( cin>>n ) {
int a[n];
for ( i = 0; i < n; i++ ) {
cin >>a[i];
}
printf("Case #%d: The maximum product is
%lld.",count++,maxprod(a,n));
printf("\n\n");
}

return 0;
}


thayumanavar s

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to algogeeks@googlegroups.com.
To unsubscribe from this group, send email to 
algogeeks+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.