51Nod - 1049 最大子段和
https://vjudge.net/problem/51Nod-1049
相似题
https://leetcode-cn.com/problems/maximum-subarray/

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=5e4+10;
int n,t;
int f[N];
int main()
{
while(~scanf("%d",&n))
{
int p=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&f[i]);
if(f[i]>0)
p=1;
}
if(!p)
{
printf("0\n");
continue;
}
long long i=1;
while(f[i]<=0)
i++;
long long sf=0,sz=0;
long long sum=0,ma=0;
for(;i<=n;i++)
{
if(f[i]>=0)
{
sum+=f[i];
sz+=f[i];
}
else
{
sf+=f[i];
if(sf+sz<=0)
{
sum=0;
sf=0;
sz=0;
}
else
sum+=f[i];
}
if(sum>ma) //这里每次都更新是关键
ma=sum;
}
if(sum>ma)
ma=sum;
printf("%lld\n",ma);
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=5e4+10;
int n;
long long a[N],b[N];
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
cin>>a[i];
b[1]=a[1];
long long ma=0;
for(int i=2;i<=n;i++)
{
b[i]=max(a[i],b[i-1]+a[i]);
ma=max(ma,b[i]);
}
cout<<ma<<endl;
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=5e4+10;
int n;
long long a[N],b[N];
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
cin>>a[i];
b[1]=a[1];
long long ma=0;
for(int i=2;i<=n;i++)
{
if(b[i-1]>0)
b[i]=b[i-1]+a[i];
else
b[i]=a[i];
if(b[i]>ma)
ma=b[i];
}
cout<<ma<<endl;
}
return 0;
}
本文来自博客园,作者:斯文~,转载请注明原文链接:https://www.cnblogs.com/zhiweb/p/15483277.html

浙公网安备 33010602011771号