[S2] 1912 연속합

eogus4658·2023년 12월 18일

유형: dp

문제를 보고 누적합 개념을 떠올려서 풀었다.

점화식이 바로 떠오르지 않아서 난감했다.


해결 시간: 1시간 14분

제출 코드

N = int(input())
arr = list(map(int, input().split()))

# 누적합 배열
sum = [arr[0]]
for n in arr[1:]:
    sum.append(sum[-1] + n)

# dp[i]: 인덱스 i까지 고려했을 때 최댓값
dp = [-float('inf') for _ in range(N)]
dp[0] = arr[0]
sum_min = arr[0] # 누적합 배열의 최소
for i in range(1, N):
    dp[i] = max(
        sum[i], # ~ i 까지의 부분합
        sum[i] - sum_min, # sum_min ~ i까지의 부분합
        dp[i-1]
    )
    sum_min = min(sum_min, sum[i])
print(dp[-1])
profile
iOS 개발자 꿈나무

0개의 댓글