BOJ 27560 - Moo Route

BOJ 27557 - Moo Route

image.png

BOJ 27560Permalink

USACO Silver의 3번 문제이다.

이 문제의 해답에서 제시하는 아이디어를 먼저 파악해보자.

먼저 방향 전환을 가장 적게하는 횟수는 (i=1N1AiAi+12)1\left(\displaystyle \sum_{i = -1}^{N-1} \dfrac{\vert A_i-A_{i+1} \vert}{2}\right) -1 이다.

A1=AN=0A_{-1}=A_N=0 으로 둔다.

오일러 회로가 존재하려면 항상 나가는 간선의 개수 = 들어오는 간선의 개수여야 하므로 모든 AiA_i는 짝수이다.

또한 Ai/2A_i/2 만큼 AiA_i에서 왼쪽으로 이동하는 횟수와 오른쪽으로 이동하는 횟수가 같다.

Ai>Ai+1A_i > A_{i+1} 라면 최소 AiAi+12\dfrac{A_i-A_{i+1}}{2} 만큼 방향 전환이 이 생긴다.

Ai/2A_i/2i.5i.5 에서 왼쪽으로 진행해야 하는데 LLLL 이 되기위해서는 이전의 LLi+2i+1i+2 \rightarrow i+1 로 가는 LL이여야 하고, 이는 최대 Ai+1/2A_{i+1}/2 번이기 때문에 방향 전환이 생기기 때문이다.

Ai<Ai+1A_i < A_{i+1} 도 유사하게 그렇다.

i=1i=-1 일땐 첫 번째 문자앞에 어떤 문자도 붙지 않기 때문에 총 횟수에 1-1 을 해준다.

(i=1N1AiAi+12)1\left(\displaystyle \sum_{i = -1}^{N-1} \dfrac{\vert A_i-A_{i+1} \vert}{2}\right) -1 만큼 방향전환만 하도록 해를 구성하는 방법이 항상 있기 때문에 이것이 최적이다.

구성하는 방법은 생략한다.

BOJ 27557Permalink

Ai/2Ai+1/2A_i / 2 \ge A_{i+1} / 2 라고 하자.

그럼 i+2i+1i+2 \to i+1 로 가는 LL은 그 다음에 ii+1i \leftarrow i+1로 가는 LL항상 붙어야 한다.

경우의 수에 영향을 미치지 않는다.

더욱 중요하게, ii+1i \to i+1 로 가는 RR은 정확히 Ai+1/2A_{i+1} / 2 개의 RR이 뒤따라 붙고 Ai+1/2A_{i+1}/2 개의 LL이 뒤따라 붙는다.

LL들을 언제 붙일지가 결국 경우의 수를 파생시킬 수 있는 핵심이다.

Ai/2Ai+1/2A_i / 2 \le A_{i+1}/2 인 경우도 유사하다.

한 가지 더 제약은 Bessie가 다시 x=0x=0 으로 돌아오기 위해 고려해야할 것이 있다.

AiAi+1A_i \ge A_{i+1} 인 경우만 Ai+1A_{i+1} 에서 LLii+1i \rightarrow i+1RR 뒤에 어디에 붙이냐에 따라 경우의 수가 달라지는데,

마지막 LL은 항상 마지막에 붙여야 하기 때문에 하나의 칸을 빼줘야한다.

해가 올바름에 대한 증명Permalink

이러한 경우의 수를 독립적으로 세도 유일한 해를 만든다는 것을 보장할 수 있다.

이 해가 올바른지에 대해서 애디토리얼에서 증명한다.

010 \leftarrow 1 로 가는 마지막 LL이 진행되었을 때 경로가 만들어졌다고 가정하자.

이전까지의 그러한 LL은 모두 010 \to 1이 그 다음 붙는다.

우린 모든 ii마다 Ai/2A_i/2개의 L,RL,R 이 모두 사용되었는지 살펴본다.

L,RL, R의 개수는 같으므로 경로에서 Ai/2A_i / 2 개의 ii+1i \rightarrow i+1 이 나타났는지 확인하는 것으로 이를 보인다.

L0L_0이 가정에 의해 참이다.

귀납적으로 Ai/2A_i/2개의 ii+1i \leftarrow i+1 이 현재 경로에 나타나있다고 하자.

만약 AiAi+1A_i \ge A_{i+1} 라면 AiAi12\dfrac{A_i-A_{i-1}}{2}개의 ii+1i \leftarrow i+1ii+1i \to i+1 앞에 있어야 한다. 또한 개중 Ai+1/2A_{i+1}/2 개는 i+1i+2i + 1 \leftarrow i+2 보다 먼저 나타나야 한다.

따라서 모든 Ai/2A_i / 2 개의 ii+1i \leftarrow i+1이 현재 경로에 나타나려면 AiAi+1A_i \ge A_{i+1} 이기 때문에 모든 Ai+1/2A_{i+1}/2개의 i+1i+2i+1 \leftarrow i+2 도 경로에 나타나야 한다.

반대로 AiAi+1A_i \le A_{i+1}이라면 마지막 i+1i+2i+1 \leftarrow i+2 는 뒤이어 곧바로 ii+1i \leftarrow i+1 이 따라붙기 때문에 모든 i+1i+2i+1 \leftarrow i+2 이 나타나야 ii+1i \leftarrow i+1 도 모두 나타나있음이 타당해진다. \square

정답을 구하는 법Permalink

1,21,2 번을 참고하면 다음과 같다.

i=0N2{(Ai+1/21Ai/21) if AiAi+1(Ai/2Ai+1/2) otherwise  \Large \prod_{i=0}^{N-2} \begin{cases} \dbinom{A_{i+1}/2-1}{A_i / 2-1} & \ \text{if}\ A_i \le A_{i+1} \\ \dbinom{A_i/2}{A_{i+1}/2} & \ \text{otherwise}\ \end{cases}

Tags:

Categories:

Updated:

Comments