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]);//右区域减去左区域,加一是代表找出它们之间的长度,乘以该区域的高,即为该区域的面积
}
- poj 2559 求连续的最大矩形面积(也可用于ccf最大连续矩形面积)
- 最大连续矩形面积
- 最大的连续矩形面积
- poj2082 连续矩形最大面积
- 关于求一段最大的连续矩形面积
- 最大连续矩形面积(栈实现)
- 求最大矩形面积
- POJ 2559最大矩形面积
- Poj 2559 最大矩形面积
- Poj 2559 最大矩形面积
- 面积最大的矩形
- 面积最大的矩形
- 面积最大的矩形
- 柱状图求最大矩形面积
- POJ 2559 最大矩形面积 poj 3494
- 用单调栈解决最大连续矩形面积问题
- 1102 面积最大的矩形
- poj 2559 Largest Rectangle in a Histogram 求面积最大的矩形(单调栈)
- 消息机制
- hdu 1829 A Bug's Life(带权并查集)
- jQuery笔记
- CSU 1328 近似回文词
- Java中方法重载与重写的区别
- poj 2559 求连续的最大矩形面积(也可用于ccf最大连续矩形面积)
- Android中Toast详解
- iOS开发-Day21-OC ARC&类目
- C语言-Array
- GOF设计模式趣解(23种设计模式)
- uva 10118 记忆化搜索
- 空view
- 华为机试-倒置英文句中的单词
- 大明A+B