Max Sum HDU-1003 (to find the maximum sub-segment sum and corresponding interval)

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
Idea: The largest sub-segment sum is the introductory topic of linear dp, the important thing is to understand. To find an interval is to follow that idea and update the interval accordingly. See the code specifically:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

const int maxx=1e5+100;
int a[maxx];
int n;

int main()
{
	int t;
	scanf("%d",&t);
	int k=0;
	while(t--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		int ans=a[1],sum=-inf;
		int L=1,R=1,l=1,r=1;
		for(int i=2;i<=n;i++)
		{
			if(ans>=0) ans+=a[i],r++;
			else 
			{
				if(sum<ans) sum=ans,L=l,R=r;
				ans=a[i],l=r=i;
			}
			if(sum<ans) sum=ans,L=l,R=r;
		}
		printf("Case %d:\n",++k);
		printf("%d %d %d\n",sum,L,R);
		if(t)puts("");
	}
	return 0;
}

Come on a hard, ( o ) / ~

Published 652 original articles · won 101 · views 50,000+

Guess you like

Origin blog.csdn.net/starlet_kiss/article/details/105439203
Recommended