求最大子数组
求最大子数组非递归实现(输出最大子数组的和)
#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;
}