
문제 출처 : https://www.acmicpc.net/problem/1912
정수 수열이 하나 주어진다.
이 중에서 연속된 몇 개의 수를 골라 합을 구할 때, 만들 수 있는 최댓값을 구하는 문제다.
예를 들어,
10 -4 3 1 5 6 -35 12 21 -112 + 21 = 33이렇게 하면 대략:
N이 최대 100,000이라서 N^2 만 하더라도 완전탐색이 불가능하다.
완전탐색은
“모든 구간(i, j)을 다 본다”
라는 관점이었다.
DP로 바꾸려면 관점을 조금 바꿔야 한다.
“각 위치 i에서 끝나는 연속 부분 수열 중, 최댓값은 얼마나 될까?”
이렇게 물어보면, 이전 상태와의 관계를 만들 수 있다.
dp[i] = i번째 원소에서 끝나는 연속 부분 수열의 최대 합이렇게 정의하면, dp[i]는 딱 두 가지 선택지 중 하나다.
이전 구간에 이어 붙인다
dp[i-1] + a[i]여기서 새로 시작한다
a[i]따라서 점화식은 이렇게 나온다.
dp[i] = max(a[i], dp[i-1] + a[i])그리고 우리가 진짜로 원하는 값은:
max(dp[0] ~ dp[N-1])import sys
input = sys.stdin.readline
n = int(input())
nums = list(map(int,input().split()))
dp =[0]*n
dp[0] = nums[0]
for i in range(1,n):
prev = dp[i-1]+ nums[i]
now = nums[i]
dp[i] = max(prev,now)
print(max(dp))