Dada una matriz que consta de solo 0s y 1s, ¿cómo puedo encontrar la submatriz más grande que contenga solo 1s?

Fuera de la parte superior de mi cabeza, el algoritmo de fuerza bruta comienza en la esquina superior izquierda, avanza a través de columnas, luego baja una fila y otra vez, hasta que se queda sin filas. Sin embargo, encontrar la submatriz rectangular más grande de cada punto de inicio requiere un poco de trabajo:

En cada coordenada inicial, buscamos el valor 1. Si se encuentra, comenzamos a expandir para encontrar el tamaño de esta submatriz rectangular de la siguiente manera:

En un bucle, continúe hacia la derecha siempre que haya 1 adyacentes. Cuando alcances un cero, detente. Ahora tiene una matriz 1 x n , así que recuerde esa área, así como en qué columna se detuvo.

Ahora se expande hacia abajo una fila. Si hay un cero justo debajo de la coordenada inicial, hemos terminado con esta iteración (caer hasta el final del bucle interno a continuación). Sin embargo, si hay un 1 inmediatamente debajo del punto inicial, expanda hacia la derecha todo lo que pueda. hasta:

  1. Llega a la misma columna en la que se detuvo en la fila de arriba, o
  2. Llegaste a un cero. Si toca un cero, deje de expandirse hacia la derecha y recuerde esta columna como el nuevo punto de detención, en lugar de la columna final de la fila anterior. En otras palabras, no podemos extender la matriz secundaria tan a la derecha como la fila anterior sugirió que podríamos.

Ahora tenemos una matriz de filas de 2 x m . Si su área es mayor que la matriz 1 x n , esta es la nueva submatriz más grande. Sin embargo, si no es así, la matriz 1 x n era más grande en área, por lo que deberíamos ignorar la nueva por ahora.

Continúe expandiendo hacia abajo una fila a la vez si es posible, y luego en cada fila hacia la derecha si es posible (reduciendo las columnas hacia la izquierda hacia el inicio si es necesario, para mantener la forma rectangular) y siga buscando la submatriz más grande de esta primera coordenada inicial

Fin del bucle interno: cuando ya no pueda expandirse hacia la derecha o hacia abajo, sabrá cuál era la submatriz más grande desde ese punto de partida en particular.

Ahora repetimos todo el proceso para cada otra celda inicial en la matriz original. Mueva el punto de partida una columna hacia la derecha (o hacia abajo una fila, si está fuera de las columnas, comenzando desde la izquierda nuevamente) hasta que todas las celdas se hayan utilizado como punto de partida y la matriz secundaria más grande, utilizando cualquiera de esos puntos de partida, tenga ha sido encontrado

Hay un problema en el que se supone que debes encontrar el rectángulo de área máxima en un histograma, puedes encontrarlo fácilmente si lo buscas en Google. Puede usar eso para encontrar el rectángulo más grande con cada fila en la matriz 2D como base, las “barras” en el histograma serán el número de 1 consecutivos verticalmente desde cada posición en una fila particular:

Submatriz binaria rectangular de tamaño máximo con todos los 1s – GeeksforGeeks

More Interesting

¿Puedo convertirme en un buen científico de datos con programación pero no con habilidades matemáticas?

Si tengo una variable, X, en un modelo de regresión que se calcula usando otras tres variables (X = 0.3X1 + 0.5X2 + 0.2X3), ¿está bien que regrese 0.3X1, 0.5X2 y 0.2X3 por separado?

¿Cómo se puede construir un nuevo generador de números pseudoaleatorios criptográficamente útil?

Cómo escribir un programa en C para verificar si para cualquier triplete entero (x, y, z) y otro entero n, [matemática] n ^ x + n ^ y = n ^ z [/ matemática] ocurre para (a, b) siendo la entrada donde [matemáticas] a \ leq n \ leq b [/ matemáticas]

Debe encontrar para un número determinado de pulsaciones de teclas (N) el número máximo de caracteres 'A' que puede generar. Solo puede usar 4 teclas: A, Ctrl + A, Ctrl + C y Ctrl + V. Solo se permiten N pulsaciones de teclas. ¿Puedes escribir este programa?

Sistemas distribuidos: ¿Cuál es el significado exacto de A (Disponibilidad) y qué significa en el teorema CAP de Brewer?

¿Qué pasaría si alguien prueba P = NP o P! = NP?

¿Me engañé buscando un algoritmo para calcular la secuencia de Fibonacci?

Cómo resolver [matemáticas] (n + k) ^ j = \ Theta (n ^ j) [/ matemáticas] para k, j en números reales y j> 0

¿Cuál es un método general para calcular la complejidad temporal de un algoritmo?

¿Cómo debo aprender programación competitiva cuando soy malo en matemáticas?

¿Cuál es la complejidad computacional de la satisfacción de resolución de restricciones sobre enteros? He leído que es polinomial para las igualdades y NP-duro para las desigualdades, pero, ¿no puedes convertir siempre una restricción de desigualdad en una igualdad agregando vars de holgura?

¿Hay un sitio como el Proyecto Euler pero sobre matemáticas puras?

Ciencias de la computación teóricas: ¿Hay una prueba para: "La mejora personal recursiva es posible"?

¿Qué tan buena o mala es una idea para comenzar un doctorado teórico de CS a la edad de 27 años?