Max Sum
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
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
最大子段和 模板题 求起始位置可把我wrong坏了
先放复杂度为O(N*N)的代码
#include<stdio.h> #include<string.h> #define N 100000+10 int dp[N]; int num[N]; int main() { int n,i,j; int t,t2,x; int start,end; int max ; scanf("%d",&t); t2 = t; while(t --) { scanf("%d",&n); for( i = 1; i <= n; i ++) scanf("%d",&num[i]); memset(dp,0,sizeof(dp)); max = -999999999; start = 1; end = 1; x = 0; for( i = 1; i <= n; i ++) { if(dp[i-1] >= 0) dp[i] = dp[i-1]+num[i]; else dp[i] = num[i]; if(dp[i] > max) { max = dp[i]; for(j = i; j >= 1; j --) { x += num[j]; if(x == max) start = j; } x = 0; end = i; } } printf("Case %d: ",t2-t); printf("%d %d %d ",max,start,end); if(t> 0) printf(" "); } return 0; }
复杂度为O(N)的代码(避免了超时问题)
#include<stdio.h> int max_start,max_end,num; int now_start,now_end; int f; int max; int main() { int t,t2,n,i; scanf("%d",&t); t2 = t; while( t --) { scanf("%d",&n); for(i = 1; i <= n; i ++) { scanf("%d",&num); if( i == 1) { f = max = num; now_start = max_end = i; } else { if( f >= 0) f += num; else { f = num; now_start = i; } } if( f >= max) { max = f; max_start = now_start; max_end = i; } } printf("Case %d: %d %d %d ",t2-t,max,max_start,max_end); if(t) printf(" "); } return 0; }