Cómo resolver el problema Submatrix2 en codeforces

Esta respuesta no requiere ese alto nivel de concepto dp. Más bien es fácil si divide el problema en subproblema.

En primer lugar, como tenemos que calcular el área de una submatriz que consiste en 1, es importante almacenar el valor de los 1 continuos en una matriz 2d. Definamos dp [i] [j] (i <r y j <c para índice basado en 0) como el número de uno continuo desde el índice (i, j) y hacia la izquierda desde (i, j) . ¿Cómo llenamos esta matriz?
si mat [i] [j] = 0: dp [i] [j] = 0
más dp [i] [j] = dp [i-1] [j] + 1
manejar los casos base también para i == 0

Como hemos llenado esto, el área para una submatriz con la esquina superior derecha como (i, j) se puede calcular usando dp [i] [j]. Aunque no es directo.

Ahora para la segunda parte donde encuentre el área máxima de submatriz con 1’s. Para esto, tome una columna particular de la matriz dp y ordénela. ¿Por qué ordenarlo? Porque tenemos la libertad de reorganizar las filas en cualquier orden. Y la clasificación nos asegurará que al menos todas las columnas tenemos todos los 1 juntos en la columna y las filas con 1 continuos en orden creciente / decreciente (tratando de ser codiciosos aquí).

Para encontrar la respuesta

para (int j = 1; j <= m; j ++) {
para (int i = 1; i <= n; i ++)
ar [i] = dp [i] [j]; \
ordenar (ar + 1, ar + 1 + n);
para (int i = 1; i <= n; i ++)
ans = max (ans, ar [i] * (n-i + 1));
}

Ahora la prueba: a medida que la matriz se ordena en orden creciente, si seleccionamos una celda de la columna que dice ar [i], estamos seguros de que el área de la submatriz como la esquina superior derecha e inferior (i, j) La esquina derecha (j, n) es ar [i] * (n-i + 1). Esto se debe a que todas las celdas tienen una longitud de 1 continuo mayor que esta y, por lo tanto, el área máxima es min (ancho) * altura donde min (ancho) es ar [i] y la altura es n-i + 1.

More Interesting

¿Cuál es el entero más pequeño que tiene 30 factores?

¿Cuáles son algunas preguntas asombrosas de CodeChef con soluciones comprensibles que me ayudarán a aprender nuevos métodos y conceptos?

¿Cómo se implementa una cadena de bloques en el código?

¿Cuál es la mejor manera de ordenar un terabyte de matriz de datos, cuando tiene RAM limitada (500k), y cada elemento de la matriz tiene un par de elementos de datos, de aproximadamente 1-10k cada uno?

¿Cuál es la complejidad temporal del algoritmo babilónico para encontrar la raíz cuadrada?

¿Cuál es el mejor algoritmo para encontrar números primos? ¿Cuál es su sintaxis?

¿Qué algoritmos y estructuras de datos se pueden usar para encontrar anagramas?

¿Cuál es la última actualización del algoritmo SEO de Google en 2017?

¿Cuántos niveles habrá en un árbol completamente binario si tiene n número de nodos?

¿Alguien puede dar el algoritmo detallado del algoritmo mejorado de segunda oportunidad?

Mis ubicaciones están por venir, así que he estado implementando estructuras de datos y algoritmos en Python, pero llegué a saber que muchas empresas no tienen Python instalado en sus estaciones de trabajo. ¿Es verdad? Y si es así, ¿estaría bien cambiar de Python a Java, que no recuerdo mucho?

Cuando reviso algo en Google, muestra una lista de sitios web. Pero, ¿cómo selecciona lo mejor de 1000 sitios web? ¿Hay algún algoritmo?

¿Cuáles son las aplicaciones prácticas / de la vida real / industriales de Dijkstra, Kruskal y Algortithm de Prim?

¿Cuáles son las capacidades máximas de almacenamiento de las estructuras de datos (pila, cola, listas enlazadas)?

¿Cuáles son algunos problemas de nivel intermedio en los que es imprescindible comprender la corrección de los algoritmos (y por qué)?