算法复习笔记之重要算法(二)
目录:
1.1编写算法求最大子序列和:(最大子段和)
详细题目以及要求见:acm.hdu.edu.cn/showproblem.php?pid=1003
1.1.1枚举法 时间复杂度为n的平方,超时
int max(int a[],int n)
{
int i,j,maxsum=0,m;
for(i=0;i<n;i++)
{
m=0;
for(j=i;j<n;j++)
{
m=m+a[j];
if(m>maxsum) maxsum=m;
}
}
return maxsum;
}
1.1.2
分治法
int maxsum(int a[],int left,int right)
{
int maxleft,maxright,mid,leftsum=0,rightsum=0;
int maxlefttmp=0,maxrighttmp=0;
if(left==right)
return a[left]>0?a[left]:0
mid=(left+roght)/2;
maxleft=maxsum(a,left,mid);//left part max sum
maxright=maxsum(a,mid+1,right);//right part max sum
for(int i=mid;i>=left;i--)
{
leftsum+=a[i];
if(leftsum>maxlefttmp)
maxlefttmp=leftsum;
}
for(int i=mid+1;i<=right;i++)
{
rightsum+=a[i];
if(rightsum>maxrighttmp)
maxrighttmp=rightsum;
}
return max(maxleft,maxright,maxlefttmp+maxrighttmp);
}
int max(int a[],int n)
{
int i,maxsum=0,m=0;
for(i=0;i<n;i++)
{
m=m+a[i];
if(m>maxsum)
maxsum=m;
else if(m<0)
m=0;
}
return maxsum;
}
短小精悍 嘻嘻 哈哈哈