POJ 2559 Largest Rectangle in a Histogram
2013-06-16 15:04
323 查看
题目见此:http://poj.grids.cn/practice/2559/
多种解法,经典好题啊!
解法一:
解题思路:
这题的基本思想是找出每一个矩形的左右边界(即左右边第一个比他高的),但如果直接对每一个矩形暴搜会超时。
于是可以dp一下:如果它原有左边界的左边第一个,比他本身还要高,那么它原有左边界的左边第一个的左边界就是它的左边界。晕了吧~看代码:
右边界同理
还要注意一点,就是tmp > 1 这句一定不能缺,表示如果左边界到了最左边,那么就是它了。
贴代码:
View Code
POJ上的数据为:
虽然时间跟单调队列一样,但空间省了不少,很强大的方法
更多解法:室友说还可以用斜率优化……不过有点杀鸡用牛刀了,而且数据也不会比以上解法更优
多种解法,经典好题啊!
解法一:
解题思路:
这题的基本思想是找出每一个矩形的左右边界(即左右边第一个比他高的),但如果直接对每一个矩形暴搜会超时。
于是可以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 | 512kB | 50ms | 932 B | G++ |
更多解法:室友说还可以用斜率优化……不过有点杀鸡用牛刀了,而且数据也不会比以上解法更优
相关文章推荐
- poj 2559 Largest Rectangle in a Histogram 求面积最大的矩形(单调栈)
- poj 2559 Largest Rectangle in a Histogram(单调栈)
- POJ 2559 Largest Rectangle in a Histogram【单调栈】
- POJ 2559 Largest Rectangle in a Histogram(单调栈)
- POJ 2559 Largest Rectangle in a Histogram RMQ || 单调栈
- POJ 2559 Largest Rectangle in a Histogram(单调栈)
- Largest Rectangle in a Histogram(POJ-2559)
- POJ2559 - Largest Rectangle in a Histogram - 单调栈+DP
- 【单调栈】POJ-2559 Largest Rectangle in a Histogram
- (单调栈)poj-2559 Largest Rectangle in a Histogram
- HDU 1506 && POJ 2559 Largest Rectangle in a Histogram (单调队列)
- NYOJ-258/POJ-2559/HDU-1506 Largest Rectangle in a Histogram,最大长方形,dp或者单调队列!
- POJ-2559-Largest Rectangle in a Histogram-单调栈
- POJ 2559 Largest Rectangle in a Histogram 【栈】
- poj 2559 Largest Rectangle in a Histogram
- POJ 2559 Largest Rectangle in a Histogram(单调栈)@
- POJ 2559 Largest Rectangle in a Histogram
- poj 2559 Largest Rectangle in a Histogram
- POJ 2559 Largest Rectangle in a Histogram
- POJ 2559 Largest Rectangle in a Histogram【解法一】