一直记着之前得到的能接着连下去的最大值tmp,始终更新答案ans。
#include <cstdio>
#include <cstring>
#define N 200000
#define inf 0x3f3f3f3f
int n,ans=-inf,tmp=-inf;
inline int max(int x,int y){return x>y?x:y;}
int main(){
// freopen("a.in","r",stdin);
scanf("%d",&n);
while(n--){
int x;
scanf("%d",&x);
tmp=max(tmp+x,x);
ans=max(ans,tmp);
}
printf("%d\n",ans);
return 0;
}
以前还写过一个分治。
#include<cstdio>
#include<cstring>
int n,a[200001];
int findcrossmax(int low,int mid,int high){
int sum=0,leftsum=0x80000000,rightsum=0x80000000;
for(int i=mid;i>=low;i--){
sum+=a[i];
if(sum>leftsum) leftsum=sum;
}
sum=0;
for(int i=mid+1;i<=high;i++){
sum+=a[i];
if(sum>rightsum) rightsum=sum;
}
return rightsum+leftsum;
}
int findmax(int low,int high){
if(low==high) return a[low];
int mid=(low+high)/2;
int lsum=findmax(low,mid);
int rsum=findmax(mid+1,high);
int csum=findcrossmax(low,mid,high);
if(lsum>=rsum&&lsum>=csum) return lsum;
else if(rsum>=csum) return rsum;
else return csum;
}
int main(){
//freopen("a.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
printf("%d",findmax(1,n));
return 0;
}