天天看點

算法複習筆記之重要算法(二)

算法複習筆記之重要算法(二)

目錄:

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;
 }           

短小精悍 嘻嘻 哈哈哈