题目描述
输入一个整型数组,数组里有正数也有负数,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
输入描述
输入第一行一个整数序列的序列长度,如:8
输入第二行为整数序列,数字用空格分隔,如:1 -2 3 10 -4 7 2 -5
输出描述
上述最大子数组为{3,1,-4,7,2},因此输出为18
分析
方法1:枚举所有子数组并求和。 先从第一个数字开始找到最大的子数组的和,再从第二个数开始找到子数组的和,并找到最大的数,第二个数开始的最大数和第一个开始的最大数比,保留其中较大的,然后从第三个数开始找到最大的子数组的和,重复上述过程,直到找到最大的连续子数组的最大和。
备注:该方法效率会比较低
方法2:采用一个for循环,定义局部变量sum和全局变量max,如果子数组加上后一个数后大于等于后一个数时,那么sum变为sum加上后一个数,否则sum变为后一个数。然后判断sum是否大于max,如果大于max,那么用sum覆盖max,否则max保持不变。
代码方法1
#include<stdio.h>
int main()
{
int i,j,k,n,max,sum;
scanf("%d",&n);
int x[n];
for(i=0;i<n;i++)//输入序列x
scanf("%d",&x[i]);
for(i=0;i<n;i++)//找出子序列
{
sum=0;
//注意这里sum=0的作用,即将sum初始化,重新从0开始求和。
for(j=i;j<n;j++)
{
sum+=x[j];//求和
if(max<sum) max=sum;
}
}
printf("最大和=%d\n",max);
return 0;
}
代码方法2
#include<stdio.h>
int main()
{
int sum=0,max=0;
int n,i;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
if(sum+a[i]>=a[i])
sum+=a[i];
else
sum=a[i];
if(sum>max)
max=sum;
}
printf("%d",max);
return 0;
}