解题思路: 1.以中间的元素为界限,把子串划分为三种情况:一。左边到中间,二。右边到末尾  这两种可以递归解决!   三。中间的左右都有一部分,然后相加。
注意事项:
        第三种情况必须用临时的左右和存储值,不然会出错
参考代码:

#include<iostream>
using namespace std;
const int maxsize=100001;
int N;
int MaxSum(int a[],int left,int right){
int s1,s2,s,sum=0,midsum=0,m,lsum=0,rsum=0;
int l=left,r=right;
int ls,rs;//临时存放第三种情况左右序列的和 
if(l==r)
  sum=a[l];
  else {
  m=(r-l)/2+l;
  lsum=MaxSum(a,l,m);//第一种情况  左边到中间的和 
  rsum=MaxSum(a,m+1,r); //第二种情况  中间到右边的和 
  //第三种情况的话分左右子序列
    s1=0,ls=0;
   for(int i=m;i>=l;i--){
      ls+=a[i];     //寻找左边子序列最大和 
      if(ls>s1) s1=ls;
   }
     s2=0,rs=0;
     for(int j=m+1;j<=r;j++){
     rs+=a[j];    //寻找右边子序列最大和 
     if(rs>s2)  s2=rs;
     }
     midsum=s1+s2;
   if(midsum>lsum)
    sum=midsum;
    else sum=lsum;
    if(sum<rsum)
    sum=rsum;  }
  return sum;
}
int main(){
int A[maxsize];
   cin>>N;
   for(int i=0;i<N;i++)
   cin>>A[i];
   cout<<MaxSum(A,0,N-1);
return 0;}
点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论