#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+1;
#define max3(a,b,c) max(max(a,b),c)
int k,seq[N];
int DivideAndConquer(int a[],int left,int right){
int MaxLeftSum,MaxRightSum;//存放左右子问题的解
int MaxLeftBorderSum,MaxRightBorderSum;//存放跨分界的最大子列和
int LeftSum,RightSum;
//分无可分,终止递归
if(left>=right){
if(a[left]>0)return a[left];
else return 0;
}
//分
int center=(left+right)/2;
//求左右两边最大和
MaxLeftSum=DivideAndConquer(a,left,center);
MaxRightSum=DivideAndConquer(a,center+1,right);
//计算跨分界线的最大子列和
//从中线向左扫描
MaxLeftBorderSum=0,LeftSum=0;
for(int i=center;i>=left;i--){
LeftSum+=a[i];
MaxLeftBorderSum=max(MaxLeftBorderSum,LeftSum);
}
//从中线向右扫描
MaxRightBorderSum=0,RightSum=0;
for(int i=center+1;i<=right;i++){
RightSum+=a[i];
MaxRightBorderSum=max(MaxRightBorderSum,RightSum);
}
//返回左边最大子列和、右边最大子列和、跨分界线最大子列和中的最大值
return max3(MaxRightSum,MaxLeftSum,MaxRightBorderSum+MaxLeftBorderSum);
}
int MaxSubseqSum(int seq[],int n){
return DivideAndConquer(seq,0,n-1);
}
int main(){
cin>>k;
for(int i=0;i<k;i++){
cin>>seq[i];
}
cout<<MaxSubseqSum(seq,k);
return 0;
}
中国大学MOOC_浙江大学_数据结构 01-复杂度1 最大子列和问题
于 2023-08-05 18:59:39 首次发布