poj2479

题目:

https://ac.nowcoder.com/acm/problem/107076

题解:

先从左到右遍历一遍,求出到每个点为止的最大序列 

要把le[1]单独拿出来,如果和后面一起放到循环里会出错,因为会有负数

同理后面的ri[n] r[n]都要把最后一个单独拿出来

最后再遍历断点

(ps:是看了程大佬的代码)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=5e4+7;
const int inf=0x3f3f3f3f;
long long a[maxn],le[maxn],ri[maxn],r[maxn],las[maxn];

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    memset(le,0,sizeof(le));
    memset(ri,0,sizeof(ri));
    memset(r,0,sizeof(r));
        memset(las,0,sizeof(las));
        le[1]=a[1];
   for(int i=2;i<=n;i++)
    le[i]=max(a[i],le[i-1]+a[i]);
    ri[n]=a[n];
   for(int i=n-1;i>=1;i--)
  ri[i]=max(ri[i+1]+a[i],a[i]);
    r[n]=ri[n];
  for(int i=n-1;i>=1;i--)
    r[i]=max(r[i+1],ri[i]);
    long long ans=-inf;
  for(int i=2;i<=n;i++)
  {
      ans=max(ans,le[i-1]+r[i]);
  }
  printf("%lld\n",ans);
}
}

 

posted @ 2021-07-05 14:34  废柴废柴少女  阅读(71)  评论(0)    收藏  举报