最大连续子序列和问题

问题描述

给定一个整数列,在其中找到最大的子序列和

问题分析

算法1:分治

用分治的思想,先将数列分为两部分,最大的子序列可能出现的情况分为三种:

  1. 左半部分
  2. 右半部分
  3. 横跨左右两半部分

最大子序列和就是这三种情况中的最大值

对于前两种情况,不断对其再划分,直到其长度为1,即临界状态,此时一个数的数列的最大子序列和就是其本身

对于第三种情况,则是左半部分(包括了左半部分最后一个元素)的最大和,加上右半部分(包括右半部分第一个元素)的最大和

最后求出三者的最大值

实现代码如下:

int f(const int a[],int left,int right){
    if(left==right){
        return a[left];
    }
    int mid=(left+right)/2;
    int maxLeft=f(a,left,mid);
    int maxRight=f(a,mid+1,right);
  
    int maxBorderLeft=0,tmpLeft=0;
    for(int i=mid;i>=left;i--){
        tmpLeft+=a[i];
        if(tmpLeft>maxBorderLeft) maxBorderLeft=tmpLeft;
    }
    int maxBorderRight=0,tmpRight=0;
    for(int i=mid+1;i<=right;i++){
        tmpRight+=a[i];
        if(tmpRight>maxBorderRight) maxBorderRight=tmpRight;
    }
    int maxBorder=maxBorderLeft+maxBorderRight;
    return myMax(maxLeft,maxRight,maxBorder);
    
}
int  myMax(int a,int b,int c){
    int tmp=a>b?a:b;
    return tmp>c?tmp:c;
}

猜你喜欢

转载自www.cnblogs.com/xkf97/p/12606024.html