Dada una matriz binaria cuadrada donde puede voltear todos los elementos de una columna, ¿cómo puede encontrar el número máximo de puntos que puede obtener?

Observe que cada fila le da un punto si voltea todas las columnas que tienen 0 para esa fila O todas las columnas que tienen 1 para la misma fila. Entonces, para cada fila, la combinación de columnas que necesita voltear para obtener un punto es la máscara de bits de esa fila o la máscara de bits negada.
Entonces, si tiene la fila 1 0 0 1 1 0, puede voltear las columnas 2,3,6 (y obtener 1 1 1 1 1 1) o las columnas 1, 4,5 y obtener (0 0 0 0 0 0) obtener un punto para esta fila.
Tenga en cuenta que ninguna máscara de bits puede ser igual a su negación.

Ahora, si decide que una fila en particular es definitivamente parte de la solución, entonces tiene una combinación de columna completa, por lo que solo necesita verificar cuántas otras filas tienen la misma combinación, o su negación como una solución “+1”.
Una cosa que podría hacer es intentar que cada fila itere todas las demás filas y verifique si la combinación de la fila original es compatible (es la misma o la negación de) la combinación de la fila actual. Esto produciría un O (r ^ 2 * c) donde r es el número de filas y c es el número de columnas.

Pero puede hacerlo mejor: dado que para cada combinación de columnas que le da un punto para una fila dada solo puede puntuar en las filas que tienen la misma combinación o la negación allí, en realidad solo necesita contar para cada fila cuántas veces encontrar esa fila o su negación en la matriz. No corre el riesgo de contar una fila dos veces (tanto ella como su negación) ya que una cadena de bits no puede ser igual a su negación.
Entonces como haces esto?
Mantiene un Trie binario de todas las filas y su negación en la matriz. Para construir el trie, necesita dos operaciones de inserción por cada fila, cada una de las cuales toma tiempo O (c). Entonces puedes construir el trie en O (r * c). Ahora, para hacer que el trie sea interesante, en cada nodo hoja (que no tiene descendientes) también mantiene un valor adicional, la cantidad de veces que ocurre. Entonces, si al insertar una cadena binaria como 101101 terminas en un nodo que creaste anteriormente, simplemente incrementas el conteo para ese nodo.

Ahora recorre la matriz nuevamente, averiguando para cada fila, cuántas veces ocurre en el Trie (solo al mirarlo y verificando el valor final) y cuántas veces ocurre su negación en el Trie. Esto lleva tiempo O (r * c) ya que hay r filas y cada una tiene el tamaño c. El puntaje máximo será el máximo entre todos estos números. Para cada solución candidata (una fila o su negación), el número de lanzamientos es solo el número de 1 que puede contar.

El tiempo total de ejecución es, por lo tanto, O (r * c) que es lineal en la entrada.

Llamemos a dos filas equivalentes si pueden darle un punto al mismo tiempo. Es decir, si voltear las mismas filas lleva a todos los 1s o todos los 0s para ambas columnas, por ejemplo: 10011 y 01100 son equivalentes, pero 101010 y 101001 no lo son. Estoy seguro de que entiendes lo que quiero decir.

Ahora cuente cuántas columnas son equivalentes a cada columna (una forma de hacerlo es hacer el xor de un par de columnas y debe ser 00000 … 0000 o 11111 … 11111) y colocar las columnas en clases de equivalencia. Ahora, para las clases de equivalencia más grandes (todas ellas) tome un elemento de cada uno y cuente el que tenga menos 1s y el que tenga menos 0s, y de ellos, tome el que requiera menos volteos (si es el que tiene menos 1s, el número de vueltas es el número de 1s y si es el que tiene menos 0s es el número de 0s).

More Interesting

¿Qué temas matemáticos recomiendas en informática?

¿Cuál sería la relación más efectiva entre las matemáticas y la programación en educación?

¿Qué tan probable es que las computadoras alienígenas se basen en algo equivalente a un UTM?

¿Por qué una calculadora simple solo toma hasta 9 dígitos como entrada?

¿Volver a la Universidad para estudiar Matemáticas me ayudará a comprender completamente la lógica del algoritmo de la IA y la Programación Funcional?

¿Qué ocupa más bytes: un DVD de Windows 7 o el índice del primer decimal en pi en el que se encuentra un DVD de Windows 7?

¿Cuándo resolverá AI P frente a NP?

Teoría de la complejidad computacional: ¿Cuál es la diferencia entre las máquinas de Turing deterministas y no deterministas?

Como una niña india de 23 años, he completado mi licenciatura en tecnología. Me interesa la fotografía y la quiero como mi profesión. ¿Hay alguna forma de convencer a mi papá? ¿Qué tengo que hacer?

¿Hay algún método para generar números factoriales grandes usando C ++?

¿Qué significa cuando una función es seguida por la notación big-O?

¿Es la 'prueba' del teorema de Demorgan dada en los libros de texto una 'prueba' o una 'verificación'?

¿Cómo podemos abordar para resolver el problema de 'Infinite House of Pancakes' de Google Code Jam 2015?

¿Qué papel juega la habilidad matemática en la ingeniería informática o la codificación?

¿Cómo podemos convertir una imagen en un sistema binario (0 y 1) o un código como QR?