最大子段和算法

来源:互联网 发布:linux如何删vi除第一行 编辑:程序博客网 时间:2024/05/14 10:48

整理备忘

#include <iostream>using namespace std;//使用分治算法int maxSubSum(int* a,int left,int right){    int sum=0;    if(left==right)    {        sum=a[left]>0 ? a[left]:0;    }    else    {        int center=(left+right)/2;        int leftSum=maxSubSum(a,left,center);        int rightSum=maxSubSum(a,center+1,right);        int s1=0;        int lefts=0;        for(int i=center; i>=left; i--)        {            lefts+=a[i];            if(lefts>s1)            {                s1=lefts;            }        }        int s2=0;        int rights=0;        for(int i=center+1; i<=right; i++)        {            rights+=a[i];            if(rights>s2)            {                s2=rights;            }        }        sum=s1+s2;        if(sum<leftSum)            sum=leftSum;        if(sum<rightSum)            sum=rightSum;    }    return sum;}int main(){    int a[10]= {-1,2,3,-3,4,5,-7,8};    int start=0,end=7;    int b=maxSubSum(a,start,end);    return b;}

动态规划:

#include <iostream>using namespace std;//使用动态规划int maxSum(int *a,int n,int &start,int &end){    int b=0,sum=a[0];    int temStart=0;    for(int i=0; i<=n; i++)    {        if(b>=0)        {            b+=a[i];        }        else        {            b=a[i];            temStart=i;        }        if(b>sum)        {            sum=b;            start=temStart;            end=i;        }    }    return sum;}int main(){    int number;    cin>>number;    for(int i=1; i<=number; i++)    {        int k;        cin>>k;        int *a=new int[k];        int start=0,end=0;        for(int j=0; j<k; j++)        {            cin>>a[j];        }        int b=maxSum(a,k-1,start,end);        cout<<"Case "<<i<<":"<<endl;        cout<<b<<" "<<++start<<" "<<++end<<endl;        if(i!=number)            cout<<endl;        delete a;    }    return 0;}



原创粉丝点击