HDU - 1003 Max Sum(최대 연속 및)

제목: HDU - 1003 Max Sum
제목:
n개 수에서 연속된 수를 찾아 그 중의 가장 큰 합을 출력하고 기점, 종점을 출력한다
분석:
이 값보다 크면 현재 연속 세그먼트가 추가되고 끝점이 업데이트됩니다.
더하기 후 이 상점의 값보다 작으면 현재 연속 세그먼트를 종료하고 이 점을 시작점, 끝점으로 업데이트합니다
핵심:
       dp[i] = max(a[i], dp[i-1]+a[i]);

코드:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <time.h>

using namespace std;

int a[100000+10];

int main()
{
    //freopen("a.txt", "r", stdin);

	int t, n, i, j, Case = 1;
	scanf("%d", &t);
	while(t--)
	{
		scanf("%d", &n);
		for(i = 1; i<=n; i++)
		{
			scanf("%d", &a[i]);
		}
		int begin=1, end=1, x=1, y=1;
		int sum = 0, ans = a[1]-1;
		for(i = 1; i<=n; i++)
		{
			if(sum + a[i] >= a[i])
			{
				sum += a[i];
				end = i;
			}
			else 
			{
				sum = a[i];
				begin = i;
				end = i;
			}
			if(ans < sum)
			{
				ans = sum;
				x = begin;
				y = end;
			}
		}
		if(Case>1)printf("
"); printf("Case %d:
", Case++); printf("%d %d %d
", ans, x, y); }     return 0; }

좋은 웹페이지 즐겨찾기