Solução escrita por Caique Paiva
Conhecimentos Prévios Necessários:
Primeiro, veja que maximizar a quantidade de bolas retiradas é a mesma coisa que minimizar a quantidade de bolas que sobram. Então, seja dois intervalos em que fizemos as operações, então,
é falso, pois, suponha sem perda de generalidade que fazemos a operação em
primeiro, então, não podemos fazer a operação
, pois
já não está no vetor mais. Além disso, se
estiver contido em
, então, só precisamos fazer a operação
. Portanto, podemos supor que qualquer sequência de operações tem intervalos disjuntos.
Defina para ser a quantidade mínima de bolas que conseguimos deixar quando olhamos somente para o subarray
, em particular,
. Vamos calcular
em função das dp's menores.
Primeiro, olhando para o subarray , se não removemos a bola
, então a menor quantidade de bolas que conseguimos ter é
, pois não removemos a bola
, então nós só olhamos para o array
para fazer as operações, que nós sabemos que conseguimos deixar no mínimo
bolas nele.
Agora, se nós removermos a bola com a bola
, então removemos todas as bolas no intervalo
, ou seja, sobrou o array
, que conseguimos deixar no mínimo
bolas.
Então, veja que esses dois casos abrange todos os casos possíveis, logo
Perfeito, sabemos calcular a e nossa resposta vai ser
. Só temos um problema, para calcular essa dp, quando estamos no estado
, nós percorremos por
no pior dos casos, ou seja, a transição da i-ésima posição da dp é
. Como temos
valores para calcular, a complexidade total é
, que não passa com as constantes do problema :(.
Como podemos corrigir isso? Veja que , então, vamos criar outro vetor chamado
, inicializado com
para todo
, e vamos calcular a dp de forma iterativa. Então, quando estamos calculando
, o vetor
guarda, para todo
, com
, qual é o
onde
é minimizado e
, então
E, para atualizar depois de cada operação, basta fazer
. Com essa otimização, a transição da
está sendo realizada em
, logo calculamos a
toda em
, que passa nas constantes do problema.
Clique aqui para ver o código