본문 바로가기
Algorithms

백준 1912. 연속합

by Brian Go 2022. 6. 26.

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

 

1912번: 연속합

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

이중 반복문을 쓰자니 시간 초과가, 그렇다고 2000개 크기의 배열을 생성하자니 메모리 초과가 떠서 고민했던 문제.

문제를 풀다보니 DP는 약간 수열틱(?) 하구나 라는 감을 잡게 되었다.

 

예제 기준으로 최대 부분합 후보를 나열해보면 다음과 같다.

최대 부분합 후보를 계속 구하다가, 후보가 특정 한 값보다 작아지면 최대 부분합 후보 탈락이므로 업데이트를 해주면 된다.

위 경우에는 -14 +12 = -2 < 12 이므로 그동안의 부분합이 최대가 될 수 없고, 따라서 최대 부분합 후보를 12로 바꿔준다.

 

n = int(input())

nums = list(map(int, input().split()))
arr = [0] * n
arr[0] = nums[0]
for i in range(1, n):
	arr[i] = max(nums[i], nums[i] + arr[i - 1]) #새로 등장한 수와 최대 부분합 후보 비교

print(max(arr))

 

'Algorithms' 카테고리의 다른 글

백준 1932. 정수 삼각형  (0) 2022.06.28
백준 1149. RGB 거리  (0) 2022.06.27
백준 1904. 01타일  (0) 2022.06.24
백준 9184. 신나는 함수 실행  (0) 2022.06.23
백준 24416. 알고리즘 수업 - 피보나치 수 1  (0) 2022.06.22

댓글