最大子段和(动态规划)

给出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);
}


发布了44 篇原创文章 · 获赞 12 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章