P1115最大子段和

题目:https://www.luogu.org/problemnew/show/P1115

很简明的一道题;

这里用了递归分治,然而似乎还有更简单的做法(贪心)。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int inf=10005;
int n,a[200005];
long long cl(int l,int r)
{
    if(l==r)return a[l];
    long long ret1=-inf,ret2=-inf;
    int mid=((l+r)>>1);
    long long sum=0;
    for(int i=mid;i>=l;i--)
    {
        sum+=a[i];
        ret1=max(ret1,sum);
    }
    sum=0;
    for(int i=mid+1;i<=r;i++)
    {
        sum+=a[i];
        ret2=max(ret2,sum);
    }
    return max(cl(l,mid),max(cl(mid+1,r),ret1+ret2));
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    printf("%lld",cl(1,n));
    return 0;
}

贪心(转):

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n[200001],p,ans[200001]={0};
    int sum=-9999999;//|x|<=10000   QWQ
    cin>>p;
    for(int i=1;i<=p;i++)
    {
        cin>>n[i];//输入
        ans[i]=max(ans[i-1]+n[i],n[i]);//DP
        sum=max(sum,ans[i]);//取最大值也同时进行,节约时间
    }
    cout<<sum;//直接输出
    return 0;
}
贪心做法

 

posted @ 2018-04-05 18:24  Zinn  阅读(155)  评论(0编辑  收藏  举报