原题链接
> 注:本篇中所有坐标 (i,j)(i,j)(i,j) 是一般来说存在二维数组中的位置,而非数学上的平面直角坐标系
1 题目
1.1 题目所需求出内容
对于本题,最终要求:一个最大值
1.2 题目背景、允许、禁止与限制
背景:有 n×mn \times mn×m 个格子,不是 FFF 就是 RRR
允许:求一块全部为 FFF 的子矩形最大面积是多少
禁止:
限制:
1.3 题目数据范围与猜测
1≤n,m≤1000⟶O(nm) 1 \le n,m \le 1000 \longrightarrow O(nm)1≤n,m≤1000⟶O(nm)
1.4 一句话概括题意
有一个大长方形,求其中全部都是 FFF 的最大子矩形有多大
2 题目破题推导
> 注:以下七种方法都可以考虑一下
2.1 大拆小、小组大
2.2 正向思维转逆向思维,逆向思维转正向思维
因为我们知道,让一个矩形尽可能大,一定是让底边尽可能长。
因此对于每个柱子,找左边第一个比它低的和右边第一个比它低的,这样这段区间里,这根柱子就是最低的,能保证这段区间如果放置一个底边长度为左右间距,高为这根柱子高的矩形一定是合法的。
那么更直观讲,对于每根柱子,只需要找左边第一个比它低的,因为遍历到这根柱子为止,它一定还是最低的
这是老师讲的方法,它需要实时记录当前长度
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我也有一种方法,没有老师的复杂,就是对于每根柱子,找左右第一个比它矮的柱子,然后这个区间长度 ×\times× 这根柱子高度
2.3 分情况考虑
那刚刚一直在说柱子高度,如何求呢?
* 如果当前在地图中是 RRR,不管怎样,柱子高度都是 000
* 否则在地图中 (i,j)(i,j)(i,j) 的位置如果是 FFF,则高度就是 (i−1,j)(i-1,j)(i−1,j) 的高度 +1+1+1
2.4 数学
2.5 以终为始、以始为终
2.6 手动推导
2.7 边界测试
3 模型匹配
> 格式为:"关键词:...... ⟶\longrightarrow⟶ ......\huge{......}......"
关键词:左/右第一个比它小的数字 ⟶\longrightarrow⟶ 单调栈\huge{单调栈}单调栈
这里我用的是老师的方法
4 最终代码(禁止抄袭,仅用于参考)