Jogo do Castelo de Blocos

Solução escrita por: Márcio Vitor

Um dos maiores desafios para esse problema é dinamicidade de cada ação, em que cada movimento faz certos blocos desabarem e blocos desabados podem desabar outros blocos dependendo de quais blocos ainda não caíram.

Porem $N$ é pequeno o bastante para tentarmos uma abordagem com programação dinâmica que para todos as possibilidades de blocos desabados.

Seja $dp[mask][vez]$ = a quantidade de desabamentos mínimos a partir da posição em que um bloco $u$ ainda não foi desabado se o bit $(u-1)$ de $mask$ está ativo, $vez = 0$ representa que é a vez de Ana e $vez = 1$ é a vez de Bruno.

o caso base é quando todos os blocos desabaram e portanto não é possivel desabar mais ninguém, ou seja $dp[0][0] = 0$ e $dp[0][1] = 0$.

Para calcular as transições perceba que para uma $mask$, podemos testar todas as possibilidades de movimentos para o jogador atual, então temos que descobrir a partir da remoção desse bloco quais iram desmoronar. Guardando o grau de entrada de cada bloco podemos fazer uma dfs a partir do bloco removido $u$ subtraindo o grau de entrada dos vértices que $u$ atinge, se algum ficar com grau 0 sabemos que ele foi desmoronado e podemos ir pra ele testar se ele desmorona alguém recusivamente.

Complexidade $\mathcal{O}(2^n \cdot n \cdot (n+m))$

Clique aqui para ver o código completo.