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