HDU1506--Largest Rectangle in a Histogram (动态规划)

来源:互联网 发布:庖丁解牛乎的意思 编辑:程序博客网 时间:2024/05/22 17:43

用动态规划的思想分别求出当前建筑向左边所能延伸的递减的(相等的也行)建筑高度的左边界和当前建筑向右边所能延伸的递减的(相等的也行)建筑高度的右边界。由右边界和左边界,即可得出长度,面积就是长度*高度。

#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>#include <math.h>#define LL __int64#define maxn 100005using namespace std;struct Build{LL height;LL left;LL right;}b[maxn];int main(){LL n;while(scanf("%I64d",&n),n){for(LL i=1;i<=n;i++){scanf("%I64d",&b[i].height);b[i].left=i,b[i].right=i;}b[0].height=-1,b[n+1].height=-1;for(LL i=1;i<=n;i++){while(b[i].height<=b[b[i].left-1].height){b[i].left=b[b[i].left-1].left;}}for(LL i=n;i>=1;i--){while(b[i].height<=b[b[i].right+1].height){b[i].right=b[b[i].right+1].right;}}LL max=-1;for(LL i=1;i<=n;i++){LL sum=(b[i].right-b[i].left+1)*b[i].height;if(sum>max)max=sum;}printf("%I64d\n",max);}return 0;}