线性时间求解最大子序列和——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
Sample Output
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; }
相关文章推荐
- 求解最大子序列和问题的线性时间算法
- 大数据面试题求解:给定n个实数 ,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法(最大间隙问题)
- 最大子序列和的线性时间解法
- 最大子序列和问题的求解(时间复杂度为O(N))
- leetCode解题报告之O(n)线性时间求最大子序列和(Maximum Subarray)
- 编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和
- 最大子序列和的线性时间算法
- (C#)找出数组中最大子序列之和,分别以O(N^2),O(NlogN),O(N) 这3种时间复杂度求解
- 最大子序列和的四种求解算法及其时间比较
- 最大子序列和的求解(时间复杂度O(N))
- 算法线性编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和
- 求最大子序列的线性时间复杂度的解法的理解
- 算法导论4.1-3~4.1-5最大子数组暴力算法和递归算法的实现和线性时间算法实现
- 题目1102:最小面积子矩阵(暴力求解&最大连续子序列)
- HDU1003 Max Sum(动态规划,最大子序列和)
- 带负数的数列,求解和最大的相邻子序列之二:代码清晰
- 算法笔记1-最大子序列和问题的求解
- 最大子序列和问题的求解
- 最大子序列和问题求解 algorithm 1 O(N^3)
- 最大子序列的3种不同时间复杂度的算法