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; }