算法导论第四章分治中说的 最大子数组问题
HDOJ1003
Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).
Output
For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.
三种算法的c代码
#include<stdio.h>
#define NINF -9999999
typedef struct
{
int low;
int high;
int max;
}maxsubay;
maxsubay findMCS(int *a,int low,int mid,int high)
{
int lsum=NINF,sum=0,i,j,rsum;
maxsubay m;
for(i=mid;i>=low;i--)
{
sum+=a[i];
if(sum>lsum)
{
lsum=sum;
m.low=i;
}
}
rsum=NINF;
sum=0;
for(j=mid+1;j<=high;j++)
{
sum+=a[j];
if(sum>rsum)
{
rsum=sum;
m.high=j;
}
}
m.max=lsum+rsum;
return m;
}
//递归算法
maxsubay findMaximumSubarray(int *a,int low,int high)
{
int mid;
maxsubay l,r,c,m;
if(high==low){
m.low=low;
m.high=high;
m.max=a[low];
return m;
}
else
{
mid=(low+high)/2;
l=findMaximumSubarray(a,low,mid);
r=findMaximumSubarray(a,mid+1,high);
c=findMCS(a,low,mid,high);
if((l.max>=r.max)&&(l.max>=c.max))
return l;
else if((r.max>=l.max)&&(r.max>=c.max))
return r;
else return c;
}
}
//暴力算法
maxsubay exMaximumSubarray(int *a,int n)
{
int i,j,k,sum,max=NINF;
maxsubay m;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
sum=0;
for(k=i;k<=j;k++)
{
sum+=a[k];
if(sum>max)
{
max=sum;
m.low=i;
m.high=k;
}
}
}
}
m.max=max;
return m;
}
maxsubay findMaxSubaySp(int *a,int n)
{
int i,j,sum,max,maxleft;
maxsubay m={0,0,a[0]};
for(j=0;j<n-1;j++)
{
sum=0;max=NINF;maxleft=j+1;
for(i=j+1;i>=0;i--)
{
sum+=a[i];
if(sum>max)
{
max=sum;
maxleft=i;
}
}
if(max>m.max)
{
m.max=max;
m.low=maxleft;
m.high=j+1;
}
}
return m;
}
void main()
{
int t,n,i,k=1,a[100000];
maxsubay re;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
// re=findMaximumSubarray(a,0,n-1);
// re=exMaximumSubarray(a,n);
re=findMaxSubaySp(a,n);
if(t!=0)
printf("Case %d:\n%d %d %d\n\n",k++,re.max,re.low+1,re.high+1);
else
printf("Case %d:\n%d %d %d\n",k++,re.max,re.low+1,re.high+1);
}
}