[boj] (s5) 1010 다리 놓기

강신현·2022년 4월 20일
0

✅ DP

문제

링크

1. 문제 접근 및 해결 로직

다리를 최대한으로 놓아야 하므로 서쪽 가장 위 사이트는 전부 연결이 되어야 하고, n<=mn<=m 이므로 서쪽 가장 위 사이트는 동쪽 가장 위 사이트와 이어질 수도 있고 두번째..세번째 등등 과 이어질 수 있다.
각 경우에 따라 가능한 최대 연결 경우의 수를 구해보자.

bridge[n][m]bridge[n][m] 을 서쪽에 사이트가 nn개, 동쪽에 사이트가 mm개 일때 다리를 놓을 수 있는 최대 경우의 수라고 하자.

즉,

  • 1->1 연결될 경우 남은 다리를 연결되는 경우의 수는 bridge[n1][m1]bridge[n-1][m-1]
  • 1->2 연결될 경우 남은 다리를 연결되는 경우의 수는 bridge[n1][m2]bridge[n-1][m-2]
    ...
  • 1->i 연결될 경우 남은 다리를 연결되는 경우의 수는 bridge[n1][mi]bridge[n-1][m-i]
    (서쪽 사이트 개수 만큼 다리를 놓아야 하므로 mim-i는 무한이 작아질 수 없고 n1n-1개까지만 작아질 수 있다.)

따라서 점화식은 아래와 같다.

  • 정의
    f(n,m)f(n,m) : 서쪽에 사이트가 nn개, 동쪽에 사이트가 mm개 일때 다리를 놓을 수 있는 최대 경우의 수
  • 구하는 답
    f(n,m)f(n,m)
  • 초기값
    f(1,m)=mf(1,m)=m
  • 점화식
    f(n,m)=sum(f(n1,mi)),(i=1,2,3...)(mi>=n1)f(n,m)=sum(f(n-1,m-i)),(i=1,2,3...)(m-i>=n-1)

2. 코드

3. 시간 복잡도 분석

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

4. 문제에서 중요한 부분

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

profile
땅콩의 모험 (server)

0개의 댓글

관련 채용 정보