HDU - 1506 Largest Rectangle in a Histogram
2015-10-29 21:24
253 查看
题意:给你n个木板的长度,且宽度都为1,让你找出最大的矩形区域面积
思路:这道题的关键就是算出每个可能的矩形的面积,而面积的计算方法可以是从一个板开始找出可向左延伸和向右延伸的边界,若左边界为L右边界为R,那么矩阵大小公式就是H[i]*(R-L+1),此时我们需要找到每个板可延伸到的边界。此时用两个数组L[i],R[i]来表示第i个板的左右延伸边界。计算边界的方法为
for(i=1;i<=n;i++)
{
while(a[l[i]-1]>=a[i])
l[i]=l[l[i]-1];
}
for(i=n;i>=1;i--)
{
while(a[r[i]+1]>=a[i])
r[i]=r[r[i]+1];
}
思路:这道题的关键就是算出每个可能的矩形的面积,而面积的计算方法可以是从一个板开始找出可向左延伸和向右延伸的边界,若左边界为L右边界为R,那么矩阵大小公式就是H[i]*(R-L+1),此时我们需要找到每个板可延伸到的边界。此时用两个数组L[i],R[i]来表示第i个板的左右延伸边界。计算边界的方法为
for(i=1;i<=n;i++)
{
while(a[l[i]-1]>=a[i])
l[i]=l[l[i]-1];
}
for(i=n;i>=1;i--)
{
while(a[r[i]+1]>=a[i])
r[i]=r[r[i]+1];
}
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; long long l[110000],r[110000],a[110000]; int main() { int n,i; while(scanf("%d",&n),n!=0) { a[0]=-1; a[n+1]=-1; for(i=1;i<=n;i++) { scanf("%lld",&a[i]); r[i]=i; l[i]=i; } for(i=1;i<=n;i++) { while(a[l[i]-1]>=a[i]) l[i]=l[l[i]-1]; } for(i=n;i>=1;i--) { while(a[r[i]+1]>=a[i]) r[i]=r[r[i]+1]; } long long maxn=0,m; for(i=1;i<=n;i++) { m=a[i]*(r[i]-l[i]+1); if(m>maxn) maxn=m; } printf("%lld\n",maxn); } return 0; }
相关文章推荐
- 堆和栈的区别
- 1028 文法
- iOS 25个性能优化/内存优化常用方法
- java基础之对象的向上转型
- 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222
- MySql学习笔记_03_各个类型的存储范围
- js正序&倒序
- 怎么创建模块?
- java 外观模式 详解 带酒店管理例子
- 安装oracle 11g流程
- Oracle 12C -- ADR结构
- 注解式控制器简介
- 瓜子说
- 【日常学习】【二分图匹配】【匈牙利算法】codevs4265 大智的妹子们题解
- 基于MATLAB的卷积运算处理图像
- Java 关于读取配置文件
- ThePage jp
- 最新 Spring 4.2.2 集成 Quartz Scheduler 2.2.2 任务调度示例
- java基础之函数的复写(override)
- 用dom4j读取xml到数据库