poj2082 Terrible Sets

 1 #include<stdio.h>
 2 struct Node{ //定义堆栈 
 3     int w,h; //w为目前为止整个区域的宽度,h为当前矩形的高度 
 4 }stack[50001];
 5 int main()
 6 {
 7     int i,n,top,totalw;  //top为栈顶指针,totalw为总的宽度 
 8     int curw,curh,maxsize; //curw,curh为新矩形高度,宽度。maxsize为当前最大矩形面积 
 9     while(scanf("%d",&n),n+1)
10     {
11         for(totalw=top=maxsize=i=0;i<n;++i)
12         {
13             scanf("%d%d",&curw,&curh);
14             while(top&&curh<stack[top].h)//如果新矩形高小于栈顶元素高,则退栈 
15             {
16                 if(maxsize<((totalw-stack[top-1].w)*stack[top].h))
17                     maxsize=(totalw-stack[top-1].w)*stack[top].h;
18                 top--;
19             }
20             totalw+=curw;  //总宽度加curw 
21             top++;
22             stack[top].w=totalw;  //新矩形入栈 
23             stack[top].h=curh;
24         }
25         while(top)  //处理栈中剩余矩形 
26         {
27             if(maxsize<((totalw-stack[top-1].w)*stack[top].h))
28                 maxsize=(totalw-stack[top-1].w)*stack[top].h;
29             top--;
30         }
31         printf("%d\n",maxsize);
32     }
33     return 0;
34 }

(1)设置一个堆栈用来矩形.遇到比上一个矩形高度高的新矩形就入栈.
(2)如果遇到比上一个矩形高度低的矩形就要进行出栈合并以及最大矩形面积计算的处理.假设当前新矩形的高和宽分别为curh, curw, 利用totalw统计出栈的矩形的宽度和,然后一直进行出栈操作,每出栈一个矩形就将其宽度加到totalw上,统计将其高度乘以totalw与maxsize比较进行更新.出栈矩形的高度乘以totalw表示的是以这个矩形的高为大矩形的高可以得到的最大矩形面积.出栈操作一直进行到栈顶矩形的高度小于等于新矩形的高度.最后将新矩形的高度以及totalw + curw作为一个新的元素压入栈中.这样就完成了这种情况下对新矩形的操作.
(3)最后栈中还有一些列的矩形,这些矩形构成了一个高度非降序的矩形序列.然后再进行一边出栈处理就可以了.

原文地址:https://www.cnblogs.com/shihuajie/p/2626212.html