算法设计与分析——最大子数组

算法流程:

①将数组x[1...n]分为x[1...n/2]和x[n/2+1...n]

②递归求解子问题

    S1:数组x[1...n/2]的最大子数组。

    S2:数组x[n/2+1...n]的最大子数组。

③合并子问题,得到Smax

    S3: 跨中点的最大子数组。

    Smax=max{S1,S2,S3}

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n;

int CrossingSubArray(int a[],int low,int mid,int high)
{
    int sleft=-100,sright=-100,sum1=0,sum2=0;
    for(int i=mid;i>=0;i--)
    {
        sum1=sum1+a[i];
        if(sum1>=sleft)
        {
            sleft=sum1;
        }
    }
    for(int j=mid+1;j<n;j++)
    {
        sum2=sum2+a[j];
        if(sum2>=sright)
        {
            sright=sum2;
        }
    }
    int s3=sleft+sright;
    return s3;
}

int MaxSubArray(int a[],int low,int high)
{
    int smax;
    if(low==high)return a[low];
    else
    {
        int mid=(low+high)/2;
        int s1=MaxSubArray(a,low,mid);
        int s2=MaxSubArray(a,mid+1,high);
        int s3=CrossingSubArray(a,low,mid,high);
        smax=s1;
        if(s2>smax)
        {
            smax=s2;
        }
        if(s3>smax)
        {
            smax=s3;
        }
    }
    return smax;
}
int main()
{
    int a[100];
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    cout<<MaxSubArray(a,0,n-1)<<endl;
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值