具体参看 浅谈用极大化思想解决最大子矩形问题 这篇论文
其实本来是想做单调栈的,但是碰巧看到了最大子矩阵问题,当然可以用单调栈做,但是我先学习了悬线法,单调栈就先留个坑之后补一下
稍微说一下我对悬线法的理解,悬线的定义是上端点覆盖了一个障碍点或达到整个矩形上端的除两端外都不包含障碍点的竖线,通俗来说就是顶端是障碍点或者顶端,不包含障碍点的竖线,首先任意一个最大子矩阵都至少含有一个悬线,而悬线往两遍扫必然包含最大子矩阵。那么目前的问题就是,怎么找到所有的悬线,由于悬线和底部的点一一对应(顶端为某一障碍点的悬线可以有多个),所以可以通过枚举底端来实现。
简单说一下步骤,这是预处理
for (int i = 1; i st;int main() {int n, m, ans = 0;scanf("%d %d", &n, &m);for (int i = 1; i a[j]) {top = st.top();st.pop();ans = max(ans, (j - top) * a[top]);}a[top] = a[j];//这一步很关键也很神奇st.push(top);}while (!st.empty()) {ans = max(ans, (m + 1 - st.top()) * a[st.top()]);st.pop();}}printf("%d", ans * 3);return 0;}