[Programación rectángulo pensamiento y la práctica Semana5 trabajo de un máximo]

Descripción Asunto:

Para un histograma, encuentra la mayor área rectangular en el histograma. Por ejemplo, la siguiente altura de la imagen en el histograma de izquierda a derecha son 2, 1, 4, 5, 1, 3, 3, 1 que son de ancho, el rectángulo más grande está sombreada.
Aquí Insertar imagen Descripción

Formatos de entrada:

Que comprende una pluralidad de conjuntos de datos de entrada. Cada conjunto de datos se representa mediante un número entero n de pequeña histograma rectangular, se puede asumir que 1 <= n <= 100000. entonces el siguiente n enteros H1, ..., hn, que satisface 0 <= hi <= 1000000000. Estos histograma de izquierda a derecha de la representación digital de cada pequeño rectángulo de altura, la anchura de cada rectángulo pequeño es 1. Los datos de prueba a 0 al final.

Ejemplo de entrada:

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

Los formatos de salida:

Para cada línea de la salida de datos de prueba representa una respuesta entero.

Salida de muestra:

8
4000

ideas:

Requiere teniendo el área máxima, el foco es la altura de cada histograma a la izquierda de la anchura máxima del rectángulo hacia la derecha maleable.
Violenta idea de la solución es comenzar desde cada pequeño rectángulo, desplazamiento a la izquierda, encontrar la ubicación de la primera más corta que sus pequeños rectángulos, calcular el ancho total, se multiplica el rectángulo con la mayor superficie de la corriente comparación récord teniendo el máximo. Pero, sin duda, esto dará lugar a un tiempo de espera. Por lo tanto, debemos utilizar un método de obtención de tiempo menor anchura de cada derecho extensible rectangular y la izquierda.
Se utiliza aquí método pila monótona, traverse respectivo ajuste a presión rectangular secuencialmente este ajuste a presión mientras se mantiene la monotonicidad de la pila. Para incrementar la pila (superior pila a los incrementos inferiores pila) a menos que el elemento actual es presionado en el elemento superior, el elemento superior de la ventana emergente, y puede determinar la posición del elemento superior que se extiende en los elementos más a la derecha para ser empujado -1 hasta que los elementos para ser empujado para satisfacer la pila será presionado en la monotonicidad. Después de atravesar todos los rectángulos de posición más remotos para los elementos restantes en la pila, que se extiende derecho al elemento superior de duda la ubicación. Después siguiente iteración de su posición más a la derecha será determinado.
Entonces atravesado respectiva pila rectangular incrementales hacia atrás, que también puede ser extendido para determinar la posición de la izquierda, la única diferencia es que la posición máxima del elemento superior para ser expulsado puede extenderse posición hacia la izquierda 1 para ser empujado al elemento, y no 1, ya que es atravesada hacia atrás.
Después de determinar la anchura del rectángulo de cada extensión, puede ser atravesada con el fin de obtener el área máxima, de modo que el tiempo puede ser reducido a un nivel de complejidad lineal.

código:

#include <iostream>
using namespace std; 
const int size=1e5+10;
int n,a[size],L[size],R[size],st[size];
int main(int argc, char** argv) {
while(scanf("%d",&n)&&n!=0)
 {
  for(int i=1;i<=n;i++)
   scanf("%d",&a[i]);
  
  int l=1,r=0;
  for(int i=1;i<=n;i++)
  {
   while(l<=r&&a[st[r]]>a[i])
   {
    R[st[r]]=i-1;
    r--;
   }
   st[++r]=i;
  }
  while(l<=r)
  {
   R[st[l]]=st[r];
   l++;
  }
  for(int i=n;i>=1;i--)
  {
   while(l<=r&&a[st[r]]>a[i])
   {
    L[st[r]]=i+1;
    r--;
   }
   st[++r]=i;
  }
  while(l<=r)
  {
   L[st[l]]=st[r];
   l++;
  }
  long long ans=0;
  for(int i=1;i<=n;i++)
  {
   long long temp=(R[i]-L[i]+1)*(long long)a[i];
   ans=max(ans,temp);
  }
  
  printf("%lld\n",ans);
 }
 return 0;
}
Publicado 24 artículos originales · ganado elogios 8 · visitas 529

Supongo que te gusta

Origin blog.csdn.net/weixin_44034698/article/details/104982495
Recomendado
Clasificación