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.