hdu 1506 Largest Rectangle in a Histogram

来源:互联网 发布:纬创软件北京有限公司 编辑:程序博客网 时间:2024/05/18 20:33

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506


以前做过了一次。但是忘了。。还是没有深刻理解。。。对于动态规划一定要多思考啊。。

这题 对于 把每一个单位矩形当作必须选择的,那么 每个矩阵 的area=height*(j-k+1);

关键就是求出每个矩阵的左右边界即可....

定义一个l[N]数组    存放 第i个数的  左边界。。。初始化 f[i]=i;

那么只要当 f[i]<=f[l[i]-1]的值就要改变  l[i]的值。。一直递归下去。

同理可以求出r[N]数组。。。


下面是AC代码:

#include<stdio.h>__int64 f[100005],l[100005],r[100005];int main(){int n,i,k;__int64 sum,temp;while(1){scanf("%d",&n);if(n==0)break;else{f[0]=f[n+1]=-1;for(k=1;k<=n;k++){l[k]=r[k]=k;scanf("%I64d",&f[k]);}for(i=1;i<=n;i++){while(f[i]<=f[l[i]-1]){l[i]=l[l[i]-1];}}for(i=n;i>0;i--){while(f[i]<=f[r[i]+1])r[i]=r[r[i]+1];}sum=f[1]*(r[1]-l[1]+1);for(i=2;i<=n;i++){temp=f[i]*(r[i]-l[i]+1);if(temp>sum){sum=temp;}}printf("%I64d\n",sum);}}return 0;}