首页 > 其他 > 详细

hdu 1506 Largest Rectangle in a Histogram

时间:2014-01-19 08:51:52      阅读:417      评论:0      收藏:0      [点我收藏+]


题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506

题意:

bubuko.com,布布扣

给出n个数(如图代表矩形的高,矩形的宽统一为1)。问合并成的图形中,内置最大矩形面积是多少?

思路:a[i]代表每个矩形的高;以第i个矩形的高为内置矩形的高,l[i]表示该内置矩形的左边,r[i]代表右边。

问题转化为求l[i]和r[i]。

 求l[i]和r[i]用类似于链表的方法,详见代码。


bubuko.com,布布扣
 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int N = 100005;
 5 
 6 int l[N], r[N];
 7 long long a[N];
 8 long long max2(long long x, long long y)
 9 {
10     return x > y ? x : y;
11 }
12 
13 int main()
14 {
15     int n;
16     while(cin>>n)
17     {
18         if(n==0break;
19         for(int i=1; i<=n; i++)
20         {
21             cin >> a[i];
22             l[i] = r[i] = i;
23         }
24         a[0] = a[n+1] = -1;
25         for(int i=1; i<=n; i++)
26         {
27             while(l[i]-1>=1 && a[l[i]-1]>=a[i])
28                 l[i] = l[l[i]-1];
29         }
30         for(int i=n; i>=1; i--)
31         {
32             while(r[i]+1<=n && a[r[i]+1]>=a[i])
33                 r[i] = r[r[i]+1];
34         }
35         /*
36         cout << "  ";
37         for(int i=1; i<=n; i++)
38             cout << l[i] << " ";
39         cout << endl;
40         cout << "  ";
41         for(int i=1; i<=n; i++)
42             cout << r[i] << " ";
43         cout << endl;
44         */
45         long long ans = 0;
46         for(int i=1; i<=n; i++)
47         {
48             ans = max2(ans, a[i]*(r[i]-l[i]+1)); //精度问题,a[]要开成long long,否则"a[i]*(r[i]-l[i]+1)"这句是按int计算在类型转换成long long,计算过程溢出
49         }
50         cout << ans << endl;
51     }
52     return 0;
53 }
View Code 

hdu 1506 Largest Rectangle in a Histogram

原文:http://www.cnblogs.com/byluoluo/p/3525658.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!