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:
![sum[i][j] = sum[i][j - 1] + sum[i - 1][j] + u[i][j] - sum[i - 1][j - 1]](https://i0.wp.com/noic.com.br/wp-content/plugins/latex/cache/tex_721ecf979b8891df8deb521906c21c36.gif?ssl=1)
Para calcular o
, sendo
, iremos fazer:
![custo[i][j] = sum[j][j] - sum[i - 1][j] - sum[j][i - 1] + sum[i - 1][i - 1]](https://i0.wp.com/noic.com.br/wp-content/plugins/latex/cache/tex_82c80d96d9b508867e99559444610b1b.gif?ssl=1)
Suponha que
e que estamos calculando o
.
Sabemos que:
![custo[2][4] = sum[4][4] - sum[1][4] - sum[4][1] + sum[1][1]](https://i0.wp.com/noic.com.br/wp-content/plugins/latex/cache/tex_a944f597eb4a6968bd2d7c3fac8aa9fd.gif?ssl=1)
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:
![dp[i][j] = min(dp[i - 1][a - 1] + custo[a][j]), \forall \space a \space | \space 1 \leq a \leq j](https://i0.wp.com/noic.com.br/wp-content/plugins/latex/cache/tex_525563799220889b4e51cc62363c2a98.gif?ssl=1)
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

