HDOJ1003(最大连续子串)

来源:互联网 发布:英雄联盟 kda 软件 编辑:程序博客网 时间:2024/05/16 08:12
Problem Description
Given a sequence a[1],a[2],a[3]......a[n], 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
25 6 -1 5 4 -77 0 6 -1 1 -6 7 -5
 

Sample Output
Case 1:14 1 4Case 2:

7 1 6

暴力解法直接超时!

#include <iostream>#define  N 100002using namespace std;int main(){int i = 0,j = 0,k = 0,n = 0,size = 0,begin = 0,end  = 0,count = 0,max = 0,sum = 0,index = 1;int a[N];cin>>n;while(n--){max = 0;begin = 0;end = 0;cin>>size;for (i = 0;i < size;++i){cin>>a[i];}for (int k = 0;k < size;++k){sum = 0;for(j = k;j < size;++j){sum += a[j];if(sum > max){max = sum;begin = k;end = j;}}}cout<<"Case "<<index++<<":"<<endl;cout<<max<<" "<<begin+1<<" "<<end+1<<endl;if(0 != n) cout<<endl;}system("Pause");return 0;}

新的方法:

#include <iostream>using namespace std;#define N 100000int main(){int n = 0;int num = 0;cin>>n;int index = 1;while (n--){cin>>num;int temp = 0;int sum = 0;int len = 0;int max = -1001;int beg = 0;int end = 0;for (int i =1;i<=num;++i){cin>>temp;sum += temp;len++;if (sum > max){max = sum;beg = len;end = i;}if (sum < 0){sum = 0;len = 0;}}cout<<"Case "<<index++<<":"<<endl;cout<<max<<" "<<end-beg+1<<" "<<end<<endl;if(0 != n)cout<<endl;}system("Pause");return 0;}


0 0
原创粉丝点击