BOJ 14586 도미노 (Small)

BOJ 14586 도미노 (Small)

문제 링크:

문제 내용

생략

(도미노는 쓰러진 도미노의 끝점에 닿기만 해도 쓰러집니다.)

문제 풀이

스포일러

먼저, 주어진 배열을 xx 기준으로 정렬합니다. xx가 중복이 없다는 조건이 없으므로, xx가 같은 두 도미노가 있다면 그 중에서 hh가 큰 것을 남깁니다.

이제 xx는 모두 서로 다르고 오름차순으로 정렬되어 있다고 가정합니다.

이 문제는 다음과 같은 DP로 풀 수 있습니다.

  • left[i]: ii번째 도미노를 왼쪽으로 쓰러뜨렸을 때 마지막으로 쓰러지는 도미노
  • right[i]: ii번째 도미노를 오른쪽으로 쓰러뜨렸을 때 마지막으로 쓰러지는 도미노
  • DP[i]: 정확히 ii번째부터 NN번째까지의 도미노를 쓰러뜨리는 방법들 중에서 최소 횟수

Small에서는 NN이 작으므로 left와 right를 모두 나이브로 구할 수 있습니다.

도미노를 정확히 ii번째부터 NN번째까지 쓰러뜨리려면, 크게 두 가지 방법이 있습니다.

  • ii번째 도미노를 오른쪽으로 쓰러뜨리는 경우: i + 1 이상 right[i] + 1 이하인 jj에 대해서 1회의 동작으로 DP[j]의 상태에서 DP[i]의 상태로 들어올 수 있습니다.
  • ii번째 도미노를 왼쪽으로 쓰러뜨리는 경우: 왼쪽으로 쓰러뜨렸을 때 정확히 ii번째까지 넘어지는, 즉 left[j] == ijj에 대해서 1회의 동작으로 DP[j+1]의 상태에서 DP[i]의 상태로 들어올 수 있습니다.

이들을 모두 나이브하게 계산하면 O(N2)\mathcal{O}(N^2)의 시간에 문제를 풀 수 있습니다.

Last updated on