2026: 和最大子序列
时间限制: 1 Sec 内存限制: 512 MB
提交: 258 解决: 148
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
对于一个给定的长度为N的整数序列A,它的“子序列”的定义是:A中非空的一段连续的元素(整数)。你要完成的任务是,在所有可能的子序列中,找到一个子序列,该子序列中所有元素的和是最大的(跟其他所有子序列相比)。程序要求你输出这个最大值。
输入
输入文件的第一行包含一个整数N,第二行包含N个整数,表示A。
其中
1<=N<=100000
-10000<=A[i]<=10000
输出
输出仅包含一个整数,表示你算出的答案。
样例输入
5
3 -2 3 -5 4
样例输出
4
来源/分类
思路 :
找出序列中所有的连续的非负数序列,分别计算它们的和,找出和最大的一个序列,输出这个序列的和
1.用数组a[n]存储输入的序列
2.若该序列全为负数,输出序列中最大的数
3.否则,以数组中的负数为边界,将该序列划分为若干非负子序列,计算每个非负子序列的和,存入数组b[n]
4:输出数组b[n]中最大的数
#include<stdio.h>
int main()
{
int n,max1,j=0;
scanf("%d",&n);
int a[n],b[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
max1=a[0];
for(int i=0;i<n;i++)
if(a[i]>max1) max1=a[i];
if(max1<0) printf("%d\n",max1);
else
{
int sum=0;
for(int i=0;i<n;)
{
if(a[i]>=0)
{
sum+=a[i];
if(i==n-1) b[j++]=sum;
i++;
}
else
{
b[j++]=sum;
sum=0;
i++;
}
}
int max2=b[0];
for(int i=0;i<j;i++)
if(b[i]>max2) max2=b[i];
printf("%d\n",max2);
}
return 0;
}