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 [a,c],[b,d] dois intervalos em que fizemos as operações, então, a<b<c<d é falso, pois, suponha sem perda de generalidade que fazemos a operação em [a,c] primeiro, então, não podemos fazer a operação [b,d], pois ab já não está no vetor mais. Além disso, se [b,d] estiver contido em [a,c], então, só precisamos fazer a operação [a,c]. Portanto, podemos supor que qualquer sequência de operações tem intervalos disjuntos.
Defina dpi para ser a quantidade mínima de bolas que conseguimos deixar quando olhamos somente para o subarray a1,a2,⋯ai, em particular, dp0=0. Vamos calcular dpi+1 em função das dp's menores.
Primeiro, olhando para o subarray a1,a2,⋯,ai+1, se não removemos a bola i+1, então a menor quantidade de bolas que conseguimos ter é dpi+1, pois não removemos a bola i+1, então nós só olhamos para o array a1,⋯ai para fazer as operações, que nós sabemos que conseguimos deixar no mínimo dpi bolas nele.
Agora, se nós removermos a bola i+1 com a bola j, então removemos todas as bolas no intervalo [j,i+1], ou seja, sobrou o array a1,a2,⋯aj−1, que conseguimos deixar no mínimo dpj−1 bolas.
Então, veja que esses dois casos abrange todos os casos possíveis, logo
dpi+1=min(dpi+1,min{dpj|aj+1=ai+1,j+1<i})
Perfeito, sabemos calcular a dpn e nossa resposta vai ser n−dpn. Só temos um problema, para calcular essa dp, quando estamos no estado i, nós percorremos por dp1,dp2,⋯,dpi−1 no pior dos casos, ou seja, a transição da i-ésima posição da dp é O(i). Como temos n valores para calcular, a complexidade total é O(1+2+⋯+n)=O(n2), que não passa com as constantes do problema :(.
Como podemos corrigir isso? Veja que 1≤ai≤n, então, vamos criar outro vetor chamado m[n+1], inicializado com mi=inf para todo i, e vamos calcular a dp de forma iterativa. Então, quando estamos calculando dpi+1, o vetor m guarda, para todo ax, com x≤i, qual é o j onde dpj é minimizado e aj+1=ax, então
dpi+1=min(dpi+1,m[ai+1])
E, para atualizar m depois de cada operação, basta fazer m[ai+1]=min(m[ai+1],dpi). Com essa otimização, a transição da dp está sendo realizada em O(1), logo calculamos a dp toda em O(n), que passa nas constantes do problema.
Clique aqui para ver o código