最大子段和
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;
}
#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;
}