码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2559

时间:2016-07-24 18:01:15      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

POJ 2559

标签:

原文地址:http://www.cnblogs.com/Tree-dream/p/5701137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!