最大连续和
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 1238 测试通过 : 224
总提交 : 1238 测试通过 : 224
比赛描述
给出一个长度为n的序列A1,A2,…,An,求最大的连续和。要求找到1≤i≤j ≤n,使得Ai+Ai+1+…+Aj尽量大。
输入
第1行输入一个正整数n(n≤1000),此后输入n行,每行给出一个测试用例,包含正整数m和m个整数,以空格分隔各个数。
输出
输出n行。对于每一个测试用例,在一行输出最大的连续和。
样例输入
2
3 1 -1 3
3 1 2 3
样例输出
3
6
题目来源
刘汝佳《算法竞赛入门经典》
#include<stdio.h>
#define MX_N 1000
int a[MX_N],s[MX_N];
int main(){
int n,m,i,min_s,result;
scanf("%d",&n);
while(n--){
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d",&a[i]);
}
s[0]=a[0];
for(i=1;i<m;i++){
s[i]=s[i-1]+a[i]; //s[i]=a[0]+……a[i]
}
min_s=0;
result = a[0];
for(i=0;i<m;i++){
if(result<s[i]-min_s){ //s[i]-min_s就是以第i项为最后一项的最大连续和
result = s[i]-min_s;
}
if(min_s>s[i]){ //记录前面i个和中的最小值
min_s = s[i];
}
}
printf("%d\n",result);
}
}