Escrito por Enzo Dantas
Conhecimento prévio necessário:
A ideia mais básica (força bruta) para resolver esse problema é testar todas as possíveis entradas, o que teria uma complexidade de
(
para conseguir todos as combinações de entradas possiveis e
para simular cada uma delas). Antes de tudo, perceba como essa ideia calcula muitas coisas repetidas e pense como poderíamos calcular um certo estado (combinação de entradas) rapidamente baseado em outro estado “menor”. Sendo assim, temos duas partes do problema que temos que resolver: 1) Como simular uma combinação de entradas e 2) Como otimizar a ideia de força bruta.
Como simular uma combinação de entradas
Primeiramente, usaremos o truque de duplicar o array para simular um círculo.
Assuma que temos uma entrada na posição
e outra na posição
. Perceba que uma pessoa no salão
vai ter uma desconforto
. Logo, um salão
que contém
pessoas vai gerar um grau de desconforto de
. Sendo assim, para calcular o desconforto em relação a uma entrada, faremos um for começando de
e adicionar
(
) ao contador de desconforto. As salas depois de
são calculadas em relação a
.
Como otimizar a ideia de força bruta
Usaremos uma DP do tipo
= mínimo desconforto gerado tal que há uma entrada no índice
, a primeira entrada de todas está no índice
e ainda podemos criar
entradas.
Inicialmente, vamos brutar o
, ou seja, vamos testar colocar a primeira entrada em todos os índices. Testaremos todas as combinações de entradas da seguinte maneira: se estamos no estado (l, r, k) tal que
, podemos criar uma entrada em qualquer índice
entre
e
, o que nos leva ao estado
. Além disso, quando criamos uma entrada em
levamos em conta o desconforto das salas entre
e
. Sendo assim, formalmente,
, tal que
é o desconforto das salas entre
e
.
Os casos base são quando
, ou seja, não podemos criar nenhuma outra entrada então apenas simularemos como descrito acima e quando
, onde o resultado é sempre 0.
É facil ver que a DP possui
estados. Como em cada estado fazemos um for de tamanho possivelmente
, a complexidade da DP é
=
.
Recomendamos que você tente implementar o problema antes de ver o código. Para conferi-lo, clique aqui.
