Plus grand rectangle de 1 en 2d matrice binaire
Il y a un problème pour trouver la superficie maximale de l'1 dans le 0-1 de la matrice. Dans ce problème, il existe deux cas de figure:
- zone à mesurer est de forme carré. c'est simple par DP.
- zone à mesurer est de la forme de rectangle. je ne suis pas en mesure de penser à une solution optimale pour ce.
Exemple:
010101
101001
111101
110101
Le plus grand rectangle a une aire de 4 (ligne 3 , 5e colonne et un de plus dans la 3ème,la 4ème ligne). Nous pouvons également obtenir tous ces rectangle ?
OriginalL'auteur RATHI | 2012-07-14
Vous devez vous connecter pour publier un commentaire.
Je vais étape par le biais de quelques solutions de difficulté croissante /décroissante d'exécution de la complexité.
Tout d'abord, une attaque par force brute solution. Générer chaque rectangle possible. Vous pouvez le faire en parcourant chaque paire de points (r1,c1), (r2,c2) avec r1 ≤ r2 et c1 ≤ c2 (peut être fait avec 4 boucles for). Si un rectangle ne contient pas de 0, vous comparez la zone de la plus grande zone trouvée jusqu'à présent. C'est un O(R^3C^3).
Nous pouvons accélérer le rectangle valide vérifier à O(1). Pour ce faire, nous faire une DP où dp(r, c) stocke le nombre de 0 dans le rectangle ((1, 1), (r, c)).
Puis le nombre de 0 dans ((r1, c1), (r2, c2)) est
Vous pouvez ensuite vérifier si un rectangle est valide par nzeroes(r1,c1,r2,c2) == 0.
Il y a un O(R^2C) solution pour cela à l'aide d'un simple DP et une pile. Le DP fonctionne par colonne, en trouvant les 1 nombre de cellules au-dessus d'une cellule jusqu'à la prochaine 0. Le dp est comme suit:
dp(r, 0) = 0
dp(r, c) = 0 si la matrice[r][c] == 0
dp(r, c) = dp(r-1, c) + 1 sinon
Vous procédez de la façon suivante:
Il est également possible de résoudre le problème en temps O(RC) à l'aide de trois DP:
Les trois relations de récurrence:
h(r, c) = h(r-1, c)+1 sinon
l(r, 0) = 0
l(r, c) = min(l(r − 1, c), c − p) sinon
r(r,C+1) = 0
où p est la colonne de la précédente 0 comme nous remplir de l de gauche à droite et de r de droite à gauche.
La réponse est alors:
Cela fonctionne en raison de l'observation que le plus grand rectangle sera toujours toucher un 0 (en considérant le bord comme étant couverts à 0) sur les quatre côtés. En considérant tous les rectangles avec, au moins, en haut, à gauche et à droite de toucher un 0, nous couvrons tous les rectangles. Générer chaque rectangle possible. Vous pouvez le faire en parcourant chaque paire de points (r1,c1), (r2,c2) avec r1 ≤ r2 et c1 ≤ c2 (peut être fait avec 4 boucles for). Si un rectangle ne contient pas de 0, vous comparez la zone de la plus grande zone trouvée jusqu'à présent.
Remarque: j'ai adapté le au-dessus d'une réponse que j'ai écrit jusqu'à ici - reportez-vous à la section "Ben Maman". Dans cet article, les 0 sont des arbres. Que l'article présente également une meilleure mise en forme.
Je vous remercie beaucoup. Des grandes solutions.
OriginalL'auteur marcog
Le problème peut être réduit à trouver le maximum de la zone du rectangle dans un histogramme, plusieurs fois.
Après chaque ligne, le calcul de l'histogramme construit jusqu'à ce que la ligne, et de calculer la superficie maximale du rectangle de l'histogramme.
temp est l'histogramme de chaque étape et maxutil calcule le max rectanglular zone dans l'histogramme.
OriginalL'auteur Yashasvi
Je voudrais essayer le suivant:
(1) Décomposer la matrice dans les composants raccordés (par BFS).
(2) Pour chaque composante connexe, regardez pour les maximales rectangle.
(2), je voudrais tout d'abord verticale rectangles: Trouver le maximum possible de la largeur de chaque consécutives (min_y, max_y), et par conséquent, le domaine (de manière itérative, en O(1) par ligne, juste en regardant les min/max de 1 dans la ligne de l'appareil connecté).
Alors je voudrais transposer la matrice, et répétez le processus.
Le temps total d'exécution est O(MxN) pour BFS, alors O(largeur^2 + hauteur^2) pour chaque composante, pour un total de O(MXN + M^2 + N^2).
Je me demande quelle est la asymptotiquement optimale de la solution.
Fait partie (1) est-il clair?
OriginalL'auteur Guy Adini
**
OriginalL'auteur Nidhi Jain
Une autre approche la plus simple consiste à utiliser deux temp de M x N de tableaux pour calculer la longueur des rectangles (des lignes et des colonnes) - ie comte de consécutives de 1 alors. Traverser les deux temp matrices de trouver max répéter longueurs (des lignes et des colonnes).
Voici le code pour le même.
OriginalL'auteur Shyam
OriginalL'auteur HeadAndTail