[python/백준/DP] 1912 : 연속합

Use_Silver·2022년 2월 23일
0

Algorithm

목록 보기
16/31

연속합

문제

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, -4, 3, 1, 5, 6, -35, 12, 21, -1]

연속된 수열 중 최대의 값을 구하기 위해서 두 개의 조건을 고려해야 한다.

  • 조건 1:
    왼쪽에 있는 수를 더하는게 더 큰지

  • 조건 2:
    더하지 않는게 더 큰지

예시)
seq = [10, -4, 3, 1, 5, 6, -35, 12, 21, -1]

seq[1]에서 고를 수 있는 선택지는

  • 1) 10을 자기 자신과 더하는 것 (연속된 수열을 생성하는 것)
  • 2) 자기 자신부터 다시 시작하는 것 (연속된 수열의 시작이 되는 것)
    이다.
    여기서 최선의 값(max)는 10과 -4를 더하는 것이므로 dp[1]은 6이 된다.

seq[1]~seq[6]까지는 dp[n-1]을 더하는게 최선(max)이다.
그러나 seq[7]의 경우는 앞선 경우와 다른 경우다.

seq[7]에서 고를 수 있는 선택지

  • 1) dp[6]과 자기 자신을 더하는 것 (연속된 수열을 생성하는 것)
    *dp[6] = sum(seq[0:7]) = -14
  • 2) 자기 자신부터 다시 시작하는 것 (연속된 수열의 시작이 되는 것)
    seq[7] = 12
    이다.
    여기서 최선의 값(max)는 자기 자신부터 시작하는 것 이므로 dp[7]은 12가 된다.

코드

n = int(input())
seq = list(map(int,input().split()))

dp = [0]*n

dp[0] = seq[0]

for i in range(1, n):
    dp[i] = max(seq[i], dp[i-1]+seq[i])

print(max(dp))
profile
과정은 힘들지만😨 성장은 즐겁습니다🎵

0개의 댓글