BOJ 9457 - 기하학문양

image.png

대충 점화식을 찍어서 맞았다.

dp[i][c]dp[i][c] 를 정의하고, dp[i][0]dp[i][0]ii번 째 column을 볼 차례인데 ii 의 두 정점이 트리에서 연결되지 않은 상태의 경우의 수이고 c=1c=1이면 연결된 상태의 경우의 수라고 하자.

dp[1][0]=dp[1][1]=1dp[1][0]=dp[1][1]=1 으로 초기화해둔다.

이제 i=2i=2 부터 다음과 같은 점화식이 성립한다.

dp[i][0]=dp[i1][0]+2dp[i1][1]dp[i][1]=dp[i1][0]+3dp[i1][1] \begin{aligned} dp[i][0]=dp[i-1][0]+2dp[i-1][1] \\ dp[i][1]=dp[i-1][0]+3dp[i-1][1] \end{aligned}

c = 0

일단 i1i-1 에서도 두 정점이 연결되어 있지 않으면 항상 두 간선을 이어줘야 하기 때문에 dp[i1][0]dp[i-1][0]을 더해줘야 한다.

연결되어있다면 위로 하나만 이어주거나 아래로 하나만 이어줘야 하기 때문에 22가지의 경우가 있다. 따라서 2dp[i1][1]2dp[i-1][1] 을 더해준다.

c = 1

i1i-1 에서 두 정점이 연결되어 있지 않으면 항상 위아래 두 간선을 이어줘야 하고, ii 번째의 두 정점도 이어줘야 하기 때문에 33개의 간선을 추가하는 한 가지 경우만 있다. 그래서 dp[i1][0]dp[i-1][0] 을 더해준다.

트리에서 싸이클이 생기지 않게하기위해

  • 위 아래로만 두 간선을 잇는 경우
  • ㄱ 자로 위와 ii 번째 두 정점을 잇는 경우
  • 반대로 아래와 ii번째 두 정점을 잇는 경우

해서 3dp[i1][1]3dp[i-1][1] 을 더해줘야 한다.

이렇게 하면 원형이 아닐때의 정답이 구해진다.

직선일 때의 정답은 dp[n][1]dp[n][1] 이다.

원형일 때의 정답은 이 테이블을 사용해서 얻을 수 있다.

원형일 때 어떤 식으로 선들이 이어지는지 고려해보자.

우선 다음과 같은 경우를 한 가지 고려한다.

어떤 인접한 두 column i,i+1i, i+1 를 잇는 간선이 하나도 없어야 하고, nn 개의 후보중 그러한 것이 하나만 등장한다.

따라서 ndp[n][1]n \cdot dp[n][1] 을 정답에 더해준다.

두 번째 케이스

dp[n][0]dp[n][0]nn 번째의 두 정점이 트리에서 이어지지 않은 케이스이다.

이걸 11 번째 정점과 이어줘보자.


모르겠다 ㅈㅅ

Tags:

Categories:

Updated:

Comments