您的位置:首页 > 其它

线性时间求解最大子序列和——HDU1003

2010-04-19 18:51 274 查看
Problem Description
Given
a sequence a[1],a[2],a[3]......a
, your job is to calculate the max
sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in
this sequence is 6 + (-1) + 5 + 4 = 14.




Input
The
first line of the input contains an integer T(1<=T<=20) which
means the number of test cases. Then T lines follow, each line starts
with a number N(1<=N<=100000), then N integers followed(all the
integers are between -1000 and 1000).




Output
For
each test case, you should output two lines. The first line is "Case
#:", # means the number of the test case. The second line contains
three integers, the Max Sum in the sequence, the start position of the
sub-sequence, the end position of the sub-sequence. If there are more
than one result, output the first one. Output a blank line between two
cases.




Sample Input

2

5 6 -1 5 4 -7

7 0 6 -1 1 -6 7 -5





Sample Output

Case 1:

14 1 4

Case 2:

7 1 6


#include <iostream>
using namespace std;

int main(){
	long cnt,n;
	long a[100000];
	long temp_sum, ts, te;
	long max_sum, start, end;
	int i,j;
	j = 0;
	cin >> cnt;
	while(cnt--){
		cin >> n;
		++j;
		temp_sum = max_sum = -1024;
		for(i=0; i<n; ++i){
			cin >> a[i];
		}
		for(i=0; i<n; ++i){
			if(temp_sum < 0){
				if(a[i] > temp_sum){
					temp_sum = a[i]; ts = te = i;
					if(temp_sum > max_sum){
						max_sum = temp_sum;
						start = ts;
						end = te;
					}
				}
			}else{
				temp_sum += a[i]; te = i;
				if(temp_sum > max_sum){
					max_sum = temp_sum;
					start = ts;
					end = te;
				}
			}
		}
		cout << "Case " << j << ":" << endl;
		cout << max_sum << " " << start+1 << " " << end+1 << endl;
		if(cnt) cout << endl;
	}
	return 0;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: