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;
}
posted @ 2021-08-01 16:15  斯文~  阅读(16)  评论(0)    收藏  举报

你好!