求最大子数组

 

求最大子数组非递归实现(输出最大子数组的和)

#include <iostream>

#include "stdlib.h"

#include <string.h>

#include <string>

#include <cstring>

#include <fstream>

#include <sstream>

#include <math.h>

using namespace std;

 

int max_sub_arry(int *arr,int n)

{

    int i;

    int max,now;

    max=now=arr[0];

    for(i=1;i<n;i++)

    {

        if((now+arr[i])>0)

        {

             now+=arr[i];

        }

        else

        {

             now=0;

        }

        if(now>max)

        {

             max=now;

        }

    }

    return max;

}

int main()

{

    int n;

    cin>>n;

    int *arr=(int *)malloc(sizeof(int)*n);

    int i;

    for(i=0;i<n;i++)

    {

        cin>>arr[i];

    }

    cout<<max_sub_arry(arr,n);

    system("pause");

    return 0;

}

求最大子数组非递归实现(输出最大子段的起始和中止位置以及最大子数组的和)

#include <iostream>

#include "stdlib.h"

#include <string.h>

#include <string>

#include <cstring>

#include <fstream>

#include <sstream>

#include <math.h>

using namespace std;

void max_sub_arry(int *arr,int n)

{

   

    int start,end;

    int max,now;

    int i;

    max=now=arr[0];

    start=end=0;

    for(i=1;i<n;i++)

    {

        if((now+arr[i])>0)

        {

             now+=arr[i];

             if(now>max)

             {

                 end=i;

             }

        }

        else

        {

             now=0;

             start=i+1;

        }

        if(now>max)

        {

             max=now;

        }

    }

    cout<<"start:"<<start<<endl;

    cout<<"end:"<<end<<endl;

    cout<<"max_val:"<<max<<endl;

   

}

int main()

{

    int n;

    cin>>n;

    int *arr=(int *)malloc(sizeof(int)*n);

    int i;

    for(i=0;i<n;i++)

    {

        cin>>arr[i];

    }

    max_sub_arry(arr,n);

    system("pause");

    return 0;

}

求最大子数组分治递归实现(输出最大子数组的和)

#include <iostream>

#include "stdlib.h"

#include <string.h>

#include <string>

#include <cstring>

#include <fstream>

#include <sstream>

#include <math.h>

using namespace std;

 

int divide(int *arr,int left,int right)

{

    int leftmax,rightmax;

    int mid_leftmax,mid_rightmax,midmax;

    int s1,s2;

    int mid;

    int i,j;

    if(left==right)

    {

        if(arr[left]<0)

             return 0;

        else

             return arr[left];

    }

    else

    {

        mid=(left+right)/2;

        leftmax=divide(arr,left,mid);

        rightmax=divide(arr,mid+1,right);

 

        mid_leftmax=0;

        s1=0;

        for(i=mid;i>=left;i--)

        {

             s1+=arr[i];

             if(s1>mid_leftmax)

                 mid_leftmax=s1;

        }

 

        mid_rightmax=0;

        s2=0;

        for(j=mid+1;j<=right;j++)

        {

             s2+=arr[j];

             if(s2>mid_rightmax)

                 mid_rightmax=s2;

        }

        midmax=mid_leftmax+mid_rightmax;

 

        if(midmax<leftmax)

             midmax=leftmax;

        if(midmax<rightmax)

             midmax=rightmax;

    }

    return midmax;

}

int main()

{

    int n;

    cin>>n;

    int *arr=(int *)malloc(sizeof(int)*n);

    int i;

    for(i=0;i<n;i++)

    {

        cin>>arr[i];

    }

    cout<<divide(arr,0,n-1);

    system("pause");

    return 0;

}

 

posted on 2016-04-21 09:17  W.C  阅读(173)  评论(0编辑  收藏  举报

导航