새소식

PS/백준

[백준/1912] 연속합 (Python)

  • -

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

 

1912번: 연속합

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

www.acmicpc.net

 

Difficulty : Silver 2

 

Status : Solved

 

Time : 00:07:58

 


 

문제 설명

 

더보기

n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.

예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.

 

입력 및 출력

 

더보기

입력

첫째 줄에 정수 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)))

풀이 완료~

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

[백준/1520] 내리막 길 (Python)  (1) 2023.05.08
[백준/2240] 자두나무 (Python)  (0) 2023.05.07
[백준/2170] 선 긋기 (Python)  (0) 2023.05.04
[백준/2156] 포도주 시식 (Python)  (0) 2023.05.01
[백준/2011] 암호코드 (Python)  (0) 2023.04.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.