杭电1506题。
来源:互联网 发布:深入理解java虚拟机 编辑:程序博客网 时间:2024/04/30 00:35
http://acm.hdu.edu.cn/showproblem.php?pid=1506
题意:给出好多矩形,每个矩形的宽已规定为1,高度为输入的h[i],要求我们求出其中面积最大的矩形!!求面积。即求出哪些靠在一起的矩形的最大面积。
首先的很容易想到的就是直接求,但是一看数据太大,靠暴力是解决不了的!!因此参考了别人的方法,可以根据:
( 对于每一块木板,Area=height[i]*(j-k+1) 其中,j<=x<=k,height[x]>=height[i];找j,k成为关键,一般方法肯定超时,利用动态规划,如果它左边高度大于等于它本身,那么它左边的左边界一定满足这个性质,再从这个边界的左边迭代下去
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<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int maxn=100005;__int64 h[maxn],l[maxn],r[maxn];int main(){ __int64 i,j,n; while(scanf("%I64d",&n)!=EOF) { // memset(l,0,sizeof(l)); // memset(r,0,sizeof(r)); if(n==0)break; for(i=1;i<=n;i++) { scanf("%I64d",&h[i]); l[i]=i; r[i]=i; } // int x=0,y=0; for(i=1;i>=n;i++) { // l[i]=i; while(h[l[i]-1]>=h[i]&&l[i]>1) l[i]=l[l[i]-1]; } for(j=n;j>=1;j--) { // r[j]=j; while(h[r[j]+1]>=h[j]&&r[j]<n) r[j]=r[r[j]+1]; } __int64 sum=-10000,t; for(i=1;i<=n;i++) { t=(r[i]-l[i]+1)*h[i]; if(sum<t) sum=t; } //rintf("%d"); //cout<<sum<<endl; printf("%I64d\n",sum); } return 0;}
- 杭电1506题。
- 杭电ACM1002题
- 杭电ACM1003题
- 杭电1004题
- 杭电1005题
- 杭电1012题
- 杭电1013题
- 杭电1014题
- 杭电1017题
- 杭电1032题
- 杭电1015题
- 杭电1020题
- 杭电1022题
- 杭电2023题
- 杭电1004题
- 杭电1005题
- 杭电1008题
- 杭电1007题
- 怎么才能进入linux的命令行模式
- IIS7 ExtAspNet 环境下导出Excel
- C#委托和多线程
- 大话数据模式--二叉树
- 【排序】基数排序
- 杭电1506题。
- 头文件管理C++
- poj1024
- Android的onCreateOptionsMenu()创建菜单Menu
- uva 10001 Garden of Eden
- poj1321
- Webkit内核探究【2】——Webkit CSS实现
- Sqlite在32位和64位Windows操作系统上运行的问题
- CAD 闭合线段