为何第一份代码是对的,第二份代码是错的
100分
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e6+10;
int n;
int a[N];
int f[N],g[N];
int l[N],r[N];
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
f[1]=a[1];g[n]=a[n];l[1]=a[1];r[n]=a[n];
for(int i=2;i<=n;i++)
f[i]=max(f[i-1],1ll*0)+a[i],l[i]=max(l[i-1],f[i]);
for(int i=n-1;i>=1;i--)
g[i]=max(g[i+1],1ll*0)+a[i],r[i]=max(r[i+1],g[i]);
int ans=-1e18;
for(int i=2;i<n;i++)
{
//cout<<i<<" "<<l[i]<<" "<<r[i+1]<<endl;
ans=max(ans,l[i-1]+r[i+1]);
}
cout<<ans;
return 0;
}
70分
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e6+10;
int n;
int a[N];
int f[N],g[N];
int l[N],r[N];
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n+n;i++)
f[i]=g[i]=l[i]=r[i]=-1e18;
for(int i=1;i<=n;i++)
f[i]=max(f[i-1],1ll*0)+a[i],l[i]=max(l[i-1],f[i]);
l[1]=f[1];
for(int i=n;i>=1;i--)
g[i]=max(g[i+1],1ll*0)+a[i],r[i]=max(r[i+1],g[i]);
r[n]=g[n];
int ans=-1e18;
for(int i=2;i<n;i++)
{
// cout<<i<<" "<<l[i-1]<<" "<<r[i+1]<<endl;
ans=max(ans,l[i-1]+r[i+1]);
}
cout<<ans;
return 0;
}