zoukankan      html  css  js  c++  java
  • HDU 1506 Largest Rectangle in a Histogram【DP】

    题意:坐标轴上有连续的n个底均为1,高为h[i]的矩形,求能够构成的最大矩形的面积。

    学习的别人的代码 @_@

    看底的坐标怎么找的看了好一会儿---

    记l[i]为矩形的底的左边的坐标,就将它一直向左扩展

    记r[i]为矩形的底的右边的坐标(倒着找,从n开始找,题解里面还着重强调了要倒着找,要不然就体现不出优化了)至于那个优化,我想的是,每一次算r[i]的时候,它前面的一个r[i]就是覆盖得最远的了,可以减少计算(用了一组样例试验)

    然后就枚举找出面积的最大值--

    #include<iostream>  
    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    using namespace std;
    int l[100005],r[100005],h[100005];
    int main()
    {
    	int n,i;
    	while(scanf("%d",&n)!=EOF&&n)
    	{
    		for(i=1;i<=n;i++)
    		{
    			scanf("%d",&h[i]);
    			l[i]=r[i]=i;
    		}
    		
    		for(i=1;i<=n;i++)
    		while(l[i]>1&&h[l[i]-1]>=h[i])
    		l[i]=l[l[i]-1];
    		for(i=n;i>=1;i--)
    		while(r[i]<n&&h[r[i]+1]>=h[i])
    		r[i]=r[r[i]+1];
    		__int64 ans=-10000;
    		__int64 tmp;	
    		for(i=1;i<=n;i++)
    		{
    			tmp=(__int64)(r[i]-l[i]+1)*h[i];
    			if(tmp>ans)
    			ans=tmp;
    		}
    		printf("%I64d
    ",ans);		
    	}
    }
    

      

  • 相关阅读:
    sobel
    构造函数
    #pragma once & ifnde
    #pragma comment
    SET容器
    重载[] int& operator[ ]( )
    仿函数 operator()()
    remove_if erase
    vector
    map
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4283048.html
Copyright © 2011-2022 走看看