int max_subarray(int a[],int l,int h)
{
        if(l==h) 
                      return a[l];
        int left_sum,right_sum;
        left_sum=right_sum=INT_MIN;
        int sum=0;
        int mid=(l+h)/2;
        for(int i=mid;i>=l;i--)
        {
            sum=sum+a[i];
            if(sum>left_sum)
            {
                            left_sum=sum;
            }
        }
        sum=0;
        for(int i=mid+1;i<=h;i++)
        {
            sum=sum+a[i];
            if(sum>right_sum)
            {
                            right_sum=sum;
            }
        }
        int centre_sum=left_sum+right_sum;
        left_sum=max_subarray(a,l,mid);
        right_sum=max_subarray(a,mid+1,h);
        return centre_sum>left_sum?(centre_sum>right_sum?centre_sum:right_sum):(left_sum>right_sum?left_sum:right_sum);//Return max of three
}
Max * max_subarray(int *array,int l,int h){
  Max * crossing=NULL;
  Max * array_left=NULL;
  Max * array_right=NULL;

  if (h==l){
    crossing = malloc(sizeof(Max));
    crossing->maxlf = l;
    crossing->maxrt = h;
    crossing->maxsum = array[l];
    return crossing;
  }
  else {
    array_left = max_subarray(array,l,(l+h)/2);
    array_right = max_subarray(array,((l+h)/2)+1,h);
    crossing = max_crossing_sub(array,l,h);

    if ((array_left->maxsum > array_right->maxsum) && (array_left->maxsum > crossing->maxsum)){
      free(array_right);
      free(crossing);
      return array_left;
    }
    else if ((array_right->maxsum > array_left->maxsum) && (array_right->maxsum > crossing->maxsum)){
      free(array_left);
      free(crossing);
      return array_right;
    }
    else {
      free(array_right);
      free(array_left);
      return crossing;
    }
  }
}
    int max_subarray(int low, int high, vector<int>& nums){
        if (low == high)
            return max(nums[low],0);
        int mid = (low +high)/2;
        int left_sum = max_subarray(low, mid, nums);
        int right_sum = max_subarray(mid+1, high, nums);
        int cross_sum = max_cross_subarray(low, mid, high, nums);
        if ((left_sum >= right_sum) && (left_sum >= cross_sum)) return left_sum;
        if ((left_sum <= right_sum) && (cross_sum <= right_sum)) return right_sum;
        else return cross_sum;

    }
Beispiel #4
0
int max_subarray2( int darray[][NCOL], int cumarray[][NCOL] )
{
    int max_so_far = 0;
    int i, j, l, m, sum;
    int array[NCOL];

    for( i=0; i<NROW; i++ )
    {
        for( j=i; j<NROW; j++ )
        {
            for (l = 0; l < NCOL; l++)
                array[l] = cumarray[j+1][l] - cumarray[i][l]; 

            sum = max_subarray(array);

            if (max_so_far < sum)
            {
                top = i; bottom = j;
                max_so_far = sum;
            }
        }
    }

    return max_so_far;
}
int main()
{
          int a[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-47};
          printf("%d",max_subarray(a,0,14));
          getch();
          return 0;
}
int main(int argc, char* argv[])
{
  std::random_device rd;
  std::uniform_int_distribution<int> distribution(-10, 10);
  std::mt19937 engine(rd());
  auto generator = std::bind(distribution, engine);

  int count = 10;

  std::vector<int> myInts; // = {-7, -7, 8, 9, -1, -7, -5, 1, -7, 5};
  myInts.reserve(count);

  std::generate_n(std::back_inserter(myInts), count, generator);

  std::ostream_iterator<int> osi(std::cout, " ");

  std::copy(begin(myInts), end(myInts), osi);
  std::cout << " [Values]" << std::endl;

  std::vector<int>::const_iterator it_max_begin;
  std::vector<int>::const_iterator it_max_end;

  std::tie(it_max_begin, it_max_end) =
      max_subarray(myInts.cbegin(), myInts.cend());

  std::copy(it_max_begin, it_max_end, osi);
  std::cout << " [Values with largest consecutive sum ["
            << std::distance(myInts.cbegin(), it_max_begin) << ':'
            << std::distance(myInts.cbegin(), it_max_end) << ") ]" << std::endl;
}
int main()
{
    int arr[6] = {-2, 1, -3, 4, -1, 2};
    //int arr[5] = {0, 1, 0, 0, 1};
    printf("Max Sub array = %d\n", max_subarray(arr, 6));
    printf("Max Using Kadane Algo = %d\n", max_subarray_kadane(arr, 6));
    printf("Max Sub array using Divide and conquer = %d\n", max_subarray_dvd_cnqr(arr, 0, 5));
    return 0;
}
Beispiel #8
0
int main(void)
{
    FILE *fp = fopen("./week12_largedata.in", "r");
    int arr[ROW][COL];
    int cumsum[ROW+1][COL];
    int sum[COL], result;
    int i, j, k, max = 0, test = 0;

    for (i = 0; i < ROW*COL; i++)
        fscanf(fp, "%d", &arr[0][0] + i);

    for (j = 0; j < COL; j++)
        cumsum[0][j] = 0;

    for (i = 1; i < ROW+1; i++)
        for (j = 0; j < COL; j++)
            cumsum[i][j] = cumsum[i-1][j] + arr[i-1][j];

    for (i = 0; i < ROW-1; i++)
    {
        for (j = i+1; j < ROW; j++)
        {
            for (k = 0; k < COL; k++)
                sum[k] = cumsum[j+1][k] - cumsum[i][k];
            if (max_subarray(sum, COL) > max)
            {
                max = max_subarray(sum, COL);
                top = i; bottom = j;
            }
        }
    }

    for (k = 0; k < COL; k++)
        sum[k] = cumsum[bottom+1][k] - cumsum[top][k];
    result = max_subarray(sum, COL);

    printf("(TOP, LEFT) (%d, %d)\n", top, left);
    printf("(BOTTOM, RIGHT) (%d, %d)\n", bottom, right);
    printf("MAX SUM: %d\n", max);

    fclose(fp);

    return 0;
}
    int maxProfit(vector<int>& prices) {
        int size= prices.size();
        if (size < 2) return 0;
        vector<int> subarray ;
        for(int i = 1; i< size; i++){
            subarray.push_back(prices[i]- prices[i-1]);
        }
        return max_subarray(0, size-2 , subarray);

    }
int main() {
    int array[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
    int len = sizeof(array) / sizeof(int);
    int left_index = 0;
    int right_index = 0;
    int sum = 0;

    max_subarray(array, len, &left_index, &right_index, &sum);

    printf("ST_I: %d END_I: %d SUM: %d", left_index, right_index, sum); 
}
Beispiel #11
0
void max_subarray(int *arr, int low, int high, int *lo, int *hi, int *sum)
{
	if(low==high){
		*lo=low;
		*hi=high;
		*sum=arr[low];
		return;
	}
	else{
		int mid=(low+high)/2;
		int lftlo, lfthi, lftsum;
		int rtlo, rthi, rtsum;
		int crosslo, crosshi, crosssum;

		max_subarray(arr,low,mid,&lftlo,&lfthi,&lftsum);
		max_subarray(arr,mid+1,high,&rtlo,&rthi,&rtsum);
		max_cross_subarray(arr,low,mid,high,&crosslo,&crosshi,&crosssum);		

		if(lftsum>=rtsum&&lftsum>=crosssum)
		{
			*lo=lftlo;
			*hi=lfthi;
			*sum=lftsum;
			return;
		}
		else if(rtsum>=lftsum&&rtsum>=crosssum)
		{
			*lo=rtlo;
			*hi=rthi;
			*sum=rtsum;
			return;
		}
		else{

			*lo=crosslo;
			*hi=crosshi;
			*sum=crosssum;
			return;
		}
	}
}
Beispiel #12
0
int test_Kadane(void)
{
    int A[] = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };
    int countA = sizeof(A)/sizeof(int);

    int maxSum = max_subarray(A, countA);

    int beg, end;
    int maxContSum = Kadane(A, countA, &beg, &end);
    if (maxContSum == 6 && beg == 3 && end == 6) 
        return 0;
    return -1;
}
long int max_subarray(int array[], int *low, int *high)
{
    long int max_crossing_subarray(int array[], int *low, int mid, int *high);
    if (*low == *high) {
        return array[*low];
    } else {
        //Don't change avoids overflow
        int mid = *low + (*high - *low)/2;

        int left_low = *low;
        int left_high = mid;
        long int left_sum = max_subarray(array, &left_low, &left_high);

        int right_low = mid + 1;
        int right_high = *high;
        long int right_sum = max_subarray(array, &right_low, &right_high);

        int cross_low = *low;
        int cross_high = *high;
        long int cross_sum = max_crossing_subarray(array, &cross_low, mid, &cross_high);

        if (left_sum >= right_sum && left_sum >= cross_sum)
        {
            *low = left_low;
            *high = left_high;
            return left_sum;

        } else if (right_sum >= left_sum && right_sum >= cross_sum) {
            *low = right_low;
            *high = right_high;
            return right_sum;

        } else {
            *low = cross_low;
            *high = cross_high;
            return cross_sum;
        }
    }
}
void main()
{
	int *arr, length = 0, i = 0;
	printf("\nred the length of array"); 
	scanf("%d", &length);
	arr = (int *)malloc(length*sizeof(int));
	printf("\nread the elements of array");
	for (i = 0; i < length; i++)
	{
		scanf("%d", &arr[i]);
	}
	max_subarray(arr, length);
}
void max_subarray(int *array, int lo, int hi, int *left_index, int *right_index, int *sum) {
    int left_sum = 0;
    int right_sum = 0;
    int crossing_sum = 0;
    int left_sindex = 0;
    int left_eindex = 0;
    int right_sindex = 0;
    int right_eindex = 0;
    int crossing_s = 0;
    int crossing_e = 0;
    int mid = 0;
    if (lo == hi) {
        *left_index = lo;
        *right_index = hi;
        *sum = array[lo];
    } else {
        mid = (lo + hi) / 2;
        max_subarray(array, lo, mid, &left_sindex, &left_eindex, &left_sum);
        max_subarray(array, mid + 1, hi, &right_sindex, &right_eindex, &right_sum);
        maximum_crossing_arr(array, lo, hi, &crossing_s, &crossing_e, &crossing_sum);

        if (left_sum <= right_sum && right_sum >= crossing_sum) {
            *left_index = right_sindex;
            *right_index = right_eindex;
            *sum = right_sum;
        } else if (left_sum >= crossing_sum) {
            *left_index = left_sindex;
            *right_index = left_eindex;
            *sum = left_sum;
        } else {
            *left_index = crossing_s;
            *right_index = crossing_e;
            *sum = crossing_sum;
        }
    }
}
int main()
{
    int t,n,i;
    long int max_subarray(int array[], int *low, int *high);
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int Arr[n];
        for(i=0;i<n;i++)
            scanf("%d",&Arr[i]);
        int low=0,high=n-1;
        printf("%ld\n",max_subarray(Arr,&low,&high));
    }
    return 0;
}
Beispiel #17
0
int main()
{
	int N, *arr, j;
	scanf("%d",&N);
	arr=(int*)malloc(N*sizeof(int));
	for(j=0; j<N; j++)
		scanf("%d",&arr[j]);
	int lo, hi, sum;
	max_subarray(arr,0,N-1,&lo,&hi,&sum);
//	max_cross_subarray(arr,0,(N-1)/2,N-1,&lftid,&rtid,&maxsum);
	printf("\n");
	for(j=lo; j<=hi; j++)
		printf("%d ",arr[j]);
	printf("\nSum=\t%d\n",sum);
	
	return 0;
}
Beispiel #18
0
int main(int argc, char** argv) {
	//const int N = argc >1 ? atoi(argv[1]): 9;
	const int N = 9;

	int arr[9] = {-2,1,-2,4,-1,2,1,-5,4};
	printf("challenge accepted !\n");

	int bound[3] = {-1,-1,0}; 


	max_subarray(arr, bound, N);
	for (int i=bound[0]; i< bound[1]; i++)
		printf("%d, ", arr[i]);
	printf("%d\n", arr[bound[1]]);

	printf("sum is: %d\n", bound[2]);

	return 0;
}
Beispiel #19
0
void test_kadane()
{
      int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
      size_t size = sizeof arr / sizeof *arr;
      assert(max_subarray(arr, size) == 6);
}