본문 바로가기
알고리즘/백준

[백준 4097] 수익 (C++)

by fortissimo 2025. 4. 29.

https://www.acmicpc.net/problem/4097

문제


연종이는 창업했다. 오늘은 창업한지 N일이 되었고, 매일 매일 수익을 적어놓았다.

어느 날 연종이는 가장 많이 돈을 번 구간이 언제인지 궁금해졌다.

오늘이 창업한지 6일 되었고, 수익이 다음과 같다고 하자.

  • 1일: -3
  • 2일: 4
  • 3일: 9
  • 4일: -2
  • 5일: -5
  • 6일: 8

이때, 가장 많은 돈을 번 구간은 2~6까지이고 총 수입은 14이다.

입력


입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 N이 주어져 있다. (1 ≤ N ≤ 250,000) 둘째 줄부터 N개의 줄에는 매일 매일의 수익 P가 주어진다. (-10,000 ≤ P ≤ 10,000) 수익은 첫 날부터 순서대로 주어진다. 입력의 마지막 줄에는 0이 주어진다.

 

출력


각 테스트 케이스에 대해서 가장 많은 수익을 올린 구간의 수익을 출력한다. 단, 구간이 비어있으면 안 된다.

 

문제 풀이


dp 문제.

 

하나의 연속된 구간의 수익의 최댓값을 구하는 문제이다. i 일을 구간에 포함하기로 했다면, 이전의 구간(최댓값을 가지는 임의의 날짜부터 i-1일까지의 구간)을 구간에 포함해야 하는지 확인한다. 만약 이전의 구간이 0보다 작다면 그냥 i번째 일만 선택하는 것이 이득이다. 아니라면 이전의 구간을 포함하는 것이 이득이다.

 

아래는 코드.

더보기
#include <iostream>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	while (true)
	{
		int N;
		cin >> N;
		if (N == 0)
		{
			break;
		}
		int* arr = new int[N];
		long long* dp = new long long[N];
		long long answer = -2500000001;
		for (int i = 0; i < N; i++)
		{
			cin >> arr[i];
			dp[i] = arr[i];
		}
		for (int i = 1; i < N; i++)
		{
			if (dp[i - 1] >= 0)
			{
				dp[i] += dp[i - 1];
			}
			answer = max(answer, dp[i]);
		}
		std::cout << answer << "\n";
	}
	return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준 32630] Ai X Aj  (1) 2025.04.25
[백준 1817] 짐 챙기는 숌 (C++)  (0) 2025.04.11
[백준 2594] 놀이공원 (C++)  (0) 2025.04.09
[백준 2840] 행운의 바퀴 (C++)  (0) 2025.04.07
[백준 6986] 절사평균 (C++)  (0) 2025.04.05