Given a sequence a
1
1,a
2
2,a
3
3......a
n
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
Sample Output
Input
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Case 1: 14 1 4 Case 2: 7 1 6
可以利用动态规划,设置数组f[i]代表包含第i个数字的最大和,if (f[i-1]>0) f[i]=f[i-1]+a[i]; else f[i]=a[i];记得处理的同时记录下对于此f[i]的开始位置和结束位置。
#include<iostream> #include<string.h> using namespace std; struct node { int x,y; }; int a[100010],f[100010]; node mp[100010]; int main() { int T,n,i,num=0,be,en,m,c; cin>>T; c=T; while(T--) { memset(f,0,sizeof(f)); num++; be=1; en=1; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; m=a[1]; mp[0].x=1; for(i=1;i<=n;i++) { if (f[i-1]>=0) { f[i]=f[i-1]+a[i]; mp[i].x=mp[i-1].x; mp[i].y=i; if (f[i]>m) { be=mp[i].x; en=mp[i].y; m=f[i]; } } else { f[i]=a[i]; mp[i].x=i; mp[i].y=i; if (f[i]>m) { be=mp[i].x; en=mp[i].y; m=f[i]; } } } cout<<"Case "<<num<<":"<<endl; cout<<m<<" "<<be<<" "<<en<<endl; if (num!=c) cout<<endl; } return 0; }