分治策略-求最大连续子数组之和


1)开心,学习伪码之后,自己敲完的代码;发现《导论》在纯粹的算法知识方面比紫书讲的更细致,更好懂一些。

分治策略,旨在将原先的大问题不断分解成规模小的问题,比如求最大连续子数组之和,先将原数组以中间界线分为三部分,左边是中界线左边的元素,右边是中界线右边的元素,第三部分是两边都有分布的元素的集合,因为最大连续子数组之和一定是这三部分之其中的一个,所以最后比较这三部分中最大的,就是最大连续子数组之和,也是该函数的返回值。而左边、右边的计算都继续递归分治函数,直到只有一个元素为止,而第三部分是以中间界线分别向左、向右连续相加,找出最大连续子数组之和,这是最关键的一步,迭代次数为n=(mid-low+1)+(high-mid),也是将原本O(n^2)算法通过分治降为O(nlogn)的主要原因。

#include <iostream>

using namespace std;
int A[13];
int hebing(int low,int mid,int high)
{
    int sum_left=A[mid];
    int temp=0;
    for(int i=mid;i>=low;i--){
        temp+=A[i];
        if(temp>sum_left)
            sum_left=temp;
    }
    int sum_righ=A[mid];
    temp=0;
    for(int i=mid+1;i<=high;i++){
        temp+=A[i];
        if(temp>sum_righ)
            sum_righ=temp;
    }
    return sum_left+sum_righ;
}
int fenzhi(int low,int high)
{
   if(low==high){
        return A[low];
   }
   else{
        int mid=(low+high)/2;
        int left_max=fenzhi(low,mid);
        int righ_max=fenzhi(mid+1,high);
        int mid_max=hebing(low,mid,high);
        if(left_max>righ_max&&left_max>mid_max){
            return left_max;
        }
        else if(righ_max>left_max&&righ_max>mid_max){
            return righ_max;
        }
        else{
            //cout<<mid_max<<endl;
            return mid_max;
        }
   }
}
int main()
{
    for(int i=0;i<=4;i++){
        cin>>A[i];
    }
    cout<<fenzhi(0,4);
}


你可能感兴趣的:(入门,ACM,分治)