poj 2559 求连续的最大矩形面积(也可用于ccf最大连续矩形面积)

来源:互联网 发布:游戏美工招聘要求西安 编辑:程序博客网 时间:2024/05/17 02:29

这是大神的解释:

维护一个left数组,left[i]表示第i个矩形向左最多能延伸到第left[i]个矩形,且初始时left[i]=i,那么,对于矩形i,

如果h[left[i]-1]>=h[i],我们可以直接跳到left[left[i]-1],而不用再去和h[left[left[i]-1]+1],h[left[left[i]-1]+2]...h[left[i]-1]去比较

因为,我们维护的这个数组中,始终满足h[left[i]]>=h[left[i]+1]>=h[left[i]+2]>=...h[i],

且h[left[left[i]-1]]>=...>=h[left[i]-1]>=h[left[i]>=...>=h[i],这个中间的每个数都是单调非递增的

同理,对于求解一个矩形向右最多能延伸到哪,我们可以维护一个right数组,从右开始向左进行维护


附上核心代码:

        h[n+1]=h[0]=-1;
        for(i=1;i<=n;i++)
        {
            left[i]=i;
            while(h[left[i]-1]>=h[i])//个人理解:看第i个矩形能向左最大延伸到哪个矩形中,即那个矩形可以将它全部包容(当然,在这过程中,如果遇上比它还小的肯定不能融合过去的),那么在它俩之中的肯定也可被最大矩形包容,那么就可构成较大面积
            {
                left[i]=left[left[i]-1];//如果找到了,那么我们直接将它变为最大矩形的子矩形
            }
        }
        for(i=n;i>=1;i--)
        {
            right[i]=i;
            while(h[right[i]+1]>=h[i])//第i个矩形向右延伸到哪个矩形,与上面的思路一致
            {
                right[i]=right[right[i]+1];
            }
        }
        ans=-1;
        for(i=1;i<=n;i++)
        {
            ans=max(ans,(right[i]-left[i]+1)*h[i]);//右区域减去左区域,加一是代表找出它们之间的长度,乘以该区域的高,即为该区域的面积
        }

0 0
原创粉丝点击