Module: encontro no meio


Problem

1 /5


Subsequência máxima do módulo

Theory Click to read/hide

Encontro no meio
Meet-in-the-middle - uma forma de otimizar soluções, que consiste em quebrar o problema original em duas metades, resolvendo cada uma de forma independente, e então obter uma solução para o problema original combinando as soluções das metades.

Da mesma forma, faz sentido usar meet-in-the-middle se duas condições forem atendidas.
1) O tempo necessário para resolver metade do problema é assintoticamente menor que o tempo para resolver todo o problema.
2) Resolvendo meio-problemas, pode-se obter soluções para o problema todo original e, ao mesmo tempo, assintoticamente mais rápido do que apenas resolver o problema todo.
 
Exemplo
Sejam quatro arrays de inteiros A, B, C e D. É necessário selecionar exatamente um número de cada array para que a soma desses números seja igual a zero. Você pode usar uma solução ingênua, ou seja, simplesmente enumerar todas as opções possíveis. Isso funcionará para O(n4).

No entanto, podemos usar meet-in-the-middle.
Observe que a + b + c + d = 0 é equivalente a (a + b) = -(c + d).
Vamos dividir a tarefa em duas metades, ou seja, na primeira metade usaremos apenas os arrays A e B, e na segunda metade apenas C e D.
Vamos iterar todas as opções (a + b) possíveis na primeira metade e armazenar todos os valores em uma tabela hash (unordered_map, HashMap ou similar. ). Isso funciona em O(n2).
Agora vamos iterar sobre todas as opções possíveis (c + d) na segunda metade. Ao considerar uma determinada opção, verificaremos se existe um valor na tabela hash associado à soma atual do sinal oposto (então encontramos dois recíprocos que somam zero). Esta parte também funciona em O(n2).
Não temos uma fase separada de "resposta combinada" aqui; em um, fizemos isso durante a resolução de cada uma das metades. A maioria das tarefas terá uma situação semelhante.
Acabamos com uma solução em O(n2) usando meet-in-the-middle.

Vale a pena notar que meet-in-the-middle é usado com mais frequência ao otimizar soluções exponenciais, o que afeta significativamente o tempo de execução.

Problem

Dada uma matriz A que consiste em n inteiros positivos e um número m. Selecione a sequência de posições B 1, B2, ..., Bk (1 <= B1 < B2 < ... < Bk <= n) tal que   ; \((\sum_{i=1}^{k} A_{B_i}) mod \; m\) foi o máximo (ou seja , de modo que o resto da divisão da soma dos elementos da subsequência pelo número m é o máximo possível). A sequência selecionada pode ser vazia.
Calcule o valor máximo possível de \((\sum_{i=1}^{k} A_{B_i}) mod \; m\).

Entrada
A primeira linha contém dois inteiros n e m (1 <= n <= 35, 1 <= m <= 109). A segunda linha contém n inteiros A1, A2, ..., An (1 <= Ai <= 109 )< br />
Impressão
Saída um número - o valor máximo \((\sum_{i=1}^{k} A_{B_i}) mod \; m\)

 
Exemplos
# Entrada Saída
1 4 4
5 2 4 1
3
2 3 20
199 41 299
19
 
Explicações
No primeiro exemplo, você pode escolher B = {1, 2}. (A1 + A2) mod m = (5 + 2) % 4 = 3.
No segundo exemplo, você pode selecionar B = {3}.