您的位置:首页 > 其它

POJ 2559 Largest Rectangle in a Histogram

2013-06-16 15:04 323 查看
题目见此:http://poj.grids.cn/practice/2559/

多种解法,经典好题啊!

解法一:

解题思路:

这题的基本思想是找出每一个矩形的左右边界(即左右边第一个比他高的),但如果直接对每一个矩形暴搜会超时。

于是可以dp一下:如果它原有左边界的左边第一个,比他本身还要高,那么它原有左边界的左边第一个的左边界就是它的左边界。晕了吧~看代码:

tmp = i;   //先把左边界设为自己
while(arr[i] <= arr[tmp-1] && tmp > 1)
tmp = left[tmp-1];


右边界同理

还要注意一点,就是tmp > 1 这句一定不能缺,表示如果左边界到了最左边,那么就是它了。

贴代码:

#include <stdio.h>
#include <iostream>
using namespace std;
#define max(a,b) a > b ? a : b
#define N 100005
int q
={-1},w
;     //w记录的是从这个点开始,之前有几个高度大于等于此高度.
int main()
{
int n,h;
while(scanf("%d",&n),n)
{
int top = 0;
long long ans = 0;
for(int i=1;i<=n+1;i++)
{
if(i != n+1)
scanf("%d",&h);
else
h = 0;
if(h > q[top])
q[++top] = h , w[top] = 1;
else
{
long long cnt = 0;
while(h <= q[top])
{
ans = max(ans ,(cnt+w[top])*q[top] );
cnt += w[top--];
}
q[++top] = h;
w[top] = cnt+1;
}
}
cout << ans << endl;
}
return 0;
}


View Code
POJ上的数据为:


Accepted
512kB50ms932 BG++
虽然时间跟单调队列一样,但空间省了不少,很强大的方法

更多解法:室友说还可以用斜率优化……不过有点杀鸡用牛刀了,而且数据也不会比以上解法更优
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: