첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
출력
첫째 줄에 답을 출력한다.
입력 예시
10
10 -4 3 1 5 6 -35 12 21 -1
출력 예시
33
풀이
DP로 간단하게 풀어보자. 숫자 리스트에서 현재 고려해야 할 인덱스를 i라고 할 때, 다음 두 경우를 고려해보도록 하자.
DP[i][0] : i번째 인덱스를 포함하지 않은 최대 연속합을 의미한다. 즉, i-1까지의 최대 연속합을 담은 DP[i-1]중에서 최댓값을 저장햐면 된다. 식으로 나타내면 max(DP[i-1][0], DP[i-1][1]) 이 되겠다.
DP[i][1] : i번째 인덱스를 반드시 포함하는 최대 연속합을 의미한다. 즉 지난 DP[i-1][1]은 i-1번째 인덱스를 반드시 포함하는 최대 연속합이 된다. 여기에 i번째 number인 num[i]를 포함하는 경우와, 이전의 연속합을 고려하지 않고 새로운 연속합으로 num[i]만을 고려하는 두 가지 경우 중 최댓값을 저장하면 된다. 식으로 나타내면 max(DP[i-1][1] + num[i], num[i])가 된다.
마지막으로 이들 DP 리스트에서 최댓값을 반환하면 된다.
풀이 코드
N = int(input())
n_list = list(map(int, input().split()))
dp = [[-float('inf')]*2 for _ in range(N)]
dp[0][0] = n_list[0]
dp[0][1] = n_list[0]
for i in range(1, N) :
dp[i][0] = max(dp[i-1])
dp[i][1] = max(dp[i-1][1] + n_list[i], n_list[i])
print(max(map(max, dp)))