标签:
http://poj.org/problem?id=2559
题意:就是找出可以完整连接的最大的矩形面积。
思路:找出单独的一块矩形,往两边延伸,记录两边的比他高的矩形是在哪个位置,然后最右的位置减去最左边的矩形的位置。就是这个矩形最大可构成的面积。
但是,如果一个一个用循环去做的话,结果是必定超时的,所以这里要用到单调栈。
比如找出最左边的比目标矩形要高的矩形的位置的代码
1 while(!s.empty()) //对栈首先进行清空。 2 3 s.pop(); 4 5 s.push(0); //入栈一个边界位置。 6 7 for(int i=1;i<=n;i++){ 8 9 for(x=s.top();a[x]>=a[i];x=s.top()) //如果a[x]要比那个a[i]
也就是目标矩形要大的话,那么说明可以继续往左寻找。如果没有比目标矩形要大的话,那么这个就是
它的右边那个就是最临界的那个矩形。 10 s.pop(); 11 12 l[i]=x+1; 13 14 s.push(i); 15 }
1 #include <stdio.h> 2 #include <iostream> 3 #include <stack> 4 5 #define X 1000010 6 7 using namespace std; 8 9 stack<int >s; 10 int n,x; 11 long long a[X],m,ans,r[X],l[X]; 12 int main() 13 { 14 freopen("in.txt","r",stdin); 15 freopen("out.txt","w",stdout); 16 while(scanf("%d",&n),n!=0){ 17 ans=0; 18 a[0]=-1;a[n+1]=-1; 19 for(int i=1;i<=n;i++) 20 scanf("%lld",&a[i]); 21 while(!s.empty()) 22 s.pop(); s.push(0); 23 for(int i=1;i<=n;i++){ 24 for(x=s.top();a[-+x]>=a[i];x=s.top()) 25 s.pop(); 26 l[i]=x+1; 27 s.push(i); 28 } 29 while(!s.empty()) 30 s.pop();s.push(n+1); 31 for(int i=n;i>0;i--){ 32 for(x=s.top();a[x]>=a[i];x=s.top()) 33 s.pop(); 34 r[i]=x-1; 35 s.push(i); 36 printf("%lld %lld %d\n",l[i],r[i],i); 37 if((r[i]-l[i]+1)*a[i]>ans) ans=(r[i]-l[i]+1)*a[i]; 38 } 39 printf("%lld\n",ans); 40 } 41 return 0; 42 }
标签:
原文地址:http://www.cnblogs.com/Tree-dream/p/5701137.html