luogu1115 最大子段和(递推/分治)

来源:互联网 发布:战舰世界淘宝商城 编辑:程序博客网 时间:2024/05/17 06:31

一直记着之前得到的能接着连下去的最大值tmp,始终更新答案ans。

#include <cstdio>#include <cstring>#define N 200000#define inf 0x3f3f3f3fint 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;}