给出N个数字, 计算出最大的子段和。
Input
第一行给出一个数字 T(1<=T<=20) 代表接下来的组数.
接下来每 T 行,开始给出一个数组 N(1<=N<=100000), 接着跟着N个数字.
数据保证最后结果小于2^31.
Output
输出最大的字段和
Sample Input
2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
Sample Output
14
7
思路:加入最长子段和是 ai ,ai+1 ,.....aj-1,aj
那么,ai前面加起来都是小于0的,aj后面的加起来也都是小于0的
#include<iostream>
#define MAX 100001
void vInput(int nArray[],int nNum);
int nGetResult(int nArray[],int nNum);
void vOutput(int nResult);
int main(){
int nCase;
int nNum;
int i;
int nArray[MAX];
int nResult;
while(1==scanf("%d",&nCase)){
for(i=1;i<=nCase;i++){
scanf("%d",&nNum);
vInput(nArray,nNum);
nResult=nGetResult(nArray,nNum);
vOutput(nResult);
}
}
return 0;
}
void vInput(int nArray[],int nNum){
int i;
for(i=1;i<=nNum;i++){
scanf("%d",&nArray[i]);
}
}
int nGetResult(int nArray[],int nNum){
int i;
int nSum=0;
int nTempSum=0;
for(i=1;i<=nNum;i++){
if(nTempSum>=0){
nTempSum+=nArray[i];
if(nSum<nTempSum){
nSum=nTempSum;
}
}else{
nTempSum=nArray[i];
}
}
return nSum;
}
void vOutput(int nResult){
printf("%d\n",nResult);
}