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); } }
浙公网安备 33010602011771号