最大子段和

MAX SUM

Time Limit:500MS  Memory Limit:65536K
Total Submit:175 Accepted:139

Description

给定由n整数(可能为负数)组成的序列 {a1,a2,…,an},求该序列形如ai+ai+1,…,+aj的子段和的最大值。当所有的整数均为负数时定义其最大子段和为0。

Input

输入包含多组测试数据。第一行为一个整数C,表示有C组测试数据,接下来有2*C行数据,每组测试数据占2行,每组测试数据第一行是1个整数n,表示有n个整数,接下来一行有n个整数,它们之间用空格隔开.

Output

你的输出应该有C行,即每组测试数据的输出占一行,它是计算出的最大子段和.

Sample Input

1
6
-2 11 -4 13 -5 -2

 

Sample Output

20

 

 

//解法1
#include <iostream>
using namespace std;

int main()
{
    
int C, n,tsum, sum, bb;

    
while(cin>>C)
        
while(C-- && cin>>n)
        
{
            sum 
= 0;
            cin
>>tsum;
            
while(--n)
            
{
                cin
>>bb;
                
if(tsum > 0)
                    tsum 
+= bb;
                
else
                    tsum 
= bb;
                
if(tsum > sum)
                    sum 
= tsum;
            }

            cout
<<sum<<endl;
        }

    
return 0;
}


//解法2:在解法1的基础上稍作修改可以出现负数最大段
#include <iostream>
using namespace std;

int main()
{
    
int tsum, sum, C, bb, n;
    
while(cin>>C)
        
while(C-- && cin>>n)
        
{
            cin
>>tsum;
            sum 
= tsum;
            
while(--n)
            
{
                cin
>>bb;
                tsum 
+= bb;
                
if(tsum > sum)
                    sum 
= tsum;
                
if(tsum < 0)
                    tsum 
= 0;                    
            }

            
if(sum < 0)
                cout
<<0<<endl;
            
else
                cout
<<sum<<endl;
        }

    
return 0;
}

 

posted on 2009-04-14 17:53  Xredman  阅读(310)  评论(0编辑  收藏  举报

导航