[boj] (s2) 1912 연속합

강신현·2022년 4월 19일
0

✅ DP

문제

링크

1. 문제 접근 및 해결 로직

경우의 수는 세가지로 나누어 진다.

  1. n-1과 n이 연속됨
  2. n-1과 n이 연속되지 않음, n의 자리수를 덧셈에 사용하지 않은 경우
  3. n-1과 n이 연속되지 않음, n의 자리수를 덧셈에 사용한 경우

f(n)f(n) 을 n개의 수열에서 연속된 수의 합 중 가장 큰 값이라고 하면
위의 경우에 따라

  1. f(n)=f(n1)+arr[n]f(n)=f(n-1)+arr[n]
  2. f(n)=f(n1)f(n)=f(n-1)
  3. f(n)=arr[n]f(n)=arr[n] : n-1과 n이 연속되지 않기 때문에 arr[n] 자체가 연속된 가장 큰 값이 된다.

세가지 경우 중 가장 큰값이 f(n)f(n)이 된다.

  • 정의
    f(n)f(n) : n개의 수열에서 연속된 수의 합 중 가장 큰 값
  • 구하는 답
    max(f(1),f(2),f(3),...,f(n))max(f(1),f(2),f(3),...,f(n))
  • 초기값
    f(1)=arr[1]f(1)=arr[1]
  • 점화식
    f(n)=max(f(n1)+arr[n],f(n1),arr[n])f(n)=max(f(n-1)+arr[n],f(n-1),arr[n])
  • 구하는 답
    연속된 수의 합이 가장 큰 경우가 n1n-1이전 수열에 있을 수도 있는 조합일 수도 있으므로 전체에서 가장 큰 수를 구해준다.

2. 코드

3. 시간 복잡도 분석

경우의 수를 모두 구하므로
O(N)O(N)

4. 문제에서 중요한 부분

DP문제는 점화식을 도출하는 것이 중요하다.
Bottm Up(반복문)으로 풀지 Top Down(재귀)으로 풀지는 선택사항

profile
땅콩의 모험 (server)

0개의 댓글

관련 채용 정보