Solução por Samyra Almeida
Conhecimentos prévios:
Para resolver esse problema primeiro vamos definir como , onde , como o custo de colocar o intervalo de até , inclusive, em uma mesma gôndola, ou seja, as somas dos níveis de não familiaridade entre todos os pares onde .
Como , podemos concluir que a matriz é espelhada em sua diagonal( da esquerda para a direita). Sabendo disso, só iremos processar o custo de uma das metades. Agora, vamos criar o vetor sum[][] como: soma de todos elementos dentro do retângulo definido pelas posições e , onde:
Para calcular o , sendo , iremos fazer:
Suponha que e que estamos calculando o .
Sabemos que:
Note que se descontarmos da parte vermelha (sum[4][4]), imagem da esquerda, a parte amarela mais a verde e a parte azul mais a verde , os dois últimos na imagem da direita, e somarmos a parte verde , que foi descontada duas vezes. Teremos o dobro do , pois a matriz é refletida, ai basta dividir o por dois.
Já que já calculamos a matriz de custo, vamos de definir a o valor total mínimo de não familiaridade entre as -ésimas primeiras pessoas que estão nas primeiras gôndolas.
Suponha que para calcularmos a já sabemos a resposta da , e para a adicionamos uma gôndola a mais. Com isso, podemos notar que a resposta de é igual ao mínimo entre um dos estados da utilizando gôndolas até o -ésimo cara na fila mais o custo de colocar da -ésima até a -ésima pessoa na -ésima gôndola. Formalizando, temos:
Note que, em cada estado da passamos por no máximo posições, e como existem estados, a complexidade final desse algoritmo é de . O que é bem ruim. Por isso, iremos utilizar uma técnica de otimização de DP's chamada Divisão e Conquista. Valhe lembrar que não estamos falando da técnica de programação chamada Divisão e Conquista e sim da Otimização de DP (programação dinâmica).
Para que possamos aplicar Divisão e Conquista, temos que provar que