本题是求矩形区域相邻的最大值:
对于每一块矩形i,height[i]表示其高度,我们可以求出在它左边比它高的矩形的最远下标,用l[i]表示,同理有r[i];那么height[i]*(r[i]-l[i]+1)即为该矩形的"最大面积"(但并不是所有包含该矩形的面积中的最大值),只要遍历一遍,求出所有面积中的最大值即可:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; long long int height[111111]; long long int l[111111]; long long int r[111111]; int main() { long long int i,j,k,m,n; while(cin>>n,n) { l[0]=0; r[n+1]=0; for(i=1;i<=n;i++) { scanf("%I64d",&height[i]); } l[1]=1; r[n]=n; for(i=2;i<=n;i++) { k=i; while(k>1&&height[k-1]>=height[i]) { k=l[k-1]; } l[i]=k; } for(i=n-1;i>0;i--) { k=i; while(k<n&&height[i]<=height[k+1]) { k=r[k+1]; } r[i]=k; } j=-11231234; for(i=1;i<=n;i++) { k=(height[i]*(r[i]-l[i]+1)); if(k>j) j=k; } printf("%I64d\n",j); } return 0; }