1. 程式人生 > >P1115最大子段和

P1115最大子段和

cst i++ ref lld 貪心 pri pre () href

題目: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; }
貪心做法

P1115最大子段和