[boj] (g4) 2228 구간나누기

강신현·2022년 4월 22일
0

✅ DP

문제

링크

1. 문제 접근 및 해결 로직

  • 정의
    dp[n][m]dp[n][m] : 1~n 번째 인덱스까지의 배열에서 m개의 구간을 선택했을 때 구간합의 최대 값 메모이제이션
    solve(n,m)solve(n, m) : 1~n 번째 인덱스까지의 배열에서 m개의 구간을 선택했을 때 구간합의 최대 값 구하는 함수
  • 구하는 답
  • 초기값
  • 점화식
    dp[n][m]=max(solve(n1,m),solve(i2,m1)+sum)dp[n][m]=max(solve(n-1, m),solve(i-2, m-1)+sum)
    sumsum : nn에서 ii까지 구간의 원소 합
  • n번째 원소를 어느 구간에도 포함하지 않을 경우
    n을 제외한 범위를 다시 조정하여 구간합의 최대 값을 구한다.
    dp[n][m]=solve(n1,m)dp[n][m]=solve(n-1, m)
  • n번째 원소를 한구간의 원소로 포함하는 경우
    dp[n][m]=solve(i2,m1)+sumdp[n][m]=solve(i-2, m-1)+sum
    (구간끼리는 인접할 수 없으므로 i1i-1이 아니라 i2i-2가 들어감, n번째 원소가 포함한 구간을 하나 사용했으므로 m1m-1개의 구간을 찾음)
  • n번째 원소를 하나의 원소로 갖는 구간의 경우는 생각하지 않는다. 왜냐하면

https://velog.io/@keybomb/BOJ-2228-%EA%B5%AC%EA%B0%84-%EB%82%98%EB%88%84%EA%B8%B0-C

2. 코드

3. 시간 복잡도 분석

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

4. 문제에서 중요한 부분

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

profile
땅콩의 모험 (server)

0개의 댓글