HDU 1506 Largest Rectangle in a Histogram

九野的博客,转载请注明出处 http://blog.csdn.net/acmmmm/article/details/10990875

题意:给定n,后面n个数表示上述柱状图的高度(每个柱形底为1)

画一个矩阵,求面积最大是多少

 

思路:感觉跟dp有点关系,就放dp类里了,主要还是模拟思路

 

对于每一个柱形 K 能得到的最大面积是:(左连续的柱形个数+右连续的柱形个数 )* High[ K ]

而对于求左右连续个数有点像记忆化搜索

mark:

 

#include <iostream>

#include <string>

#include <cstring>

#include <algorithm>

#include <cstdio>

#include <cctype>

#include <queue>

#include <vector>

#define inf 1000000000

#define N 100010

#define ll __int64

using namespace std;

ll a[N],l[N],r[N];//l[i] 表示从 l[i] 到 i 都是连续>=a[i]的数



inline ll Max(ll a,ll b){return a>b?a:b;}

int main(){

	int n,i,j,step,temp;

	while(scanf("%d",&n),n){

		a[0]=0;

		for(i=1;i<=n;i++)scanf("%I64d",&a[i]),l[i]=r[i]=i;

		for(i=1;i<=n;i++)

			while(l[i]>1 && a[i]<=a[l[i]-1])l[i]=l[l[i]-1];



		for(i=n;i>=1;i--)

			while(r[i]<n && a[i]<=a[r[i]+1])r[i]=r[r[i]+1];



		ll ans=0;

		for(i=1;i<=n;i++)

			ans=Max(ans,(r[i]-l[i]+1)*a[i]);

		printf("%I64d\n",ans);

	}

	return 0;

}


你可能感兴趣的:(HDU)