【DP】【单调栈】question 题解

来源:互联网 发布:java 调用rest接口 编辑:程序博客网 时间:2024/06/04 19:15

给一个01矩阵,求1覆盖的最大矩形面积。

统计每一个位置高度,单调栈维护,顺着跑一遍。

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <set>#include <queue>#include <algorithm>#include <vector>#include <cstdlib>#include <cmath>#include <ctime>#include <stack>#define INF 2147483647#define LL long long#define clr(x) memset(x, 0, sizeof x)#define digit (ch <  '0' || ch >  '9')using namespace std;template <class T> inline void read(T &x) {    int flag = 1; x = 0;    register char ch = getchar();    while( digit) { if(ch == '-')  flag = -1; ch = getchar(); }    while(!digit) { x = (x<<1)+(x<<3)+ch-'0'; ch = getchar(); }    x *= flag;}const int maxn = 1005;int n,m,ans,st[maxn],ls[maxn],mp[maxn][maxn],up[maxn][maxn];int main() {    freopen("question.in","r",stdin);    freopen("question.out","w",stdout);    read(n); read(m);    for(register int i = 1; i <= n; i++)        for(register int j = 1; j <= m; j++) {            read(mp[i][j]);            if(mp[i][j]) up[i][j] = up[i-1][j]+1;        }    for(register int i = 1; i <= n; i++) {        int tp = 0;        for(register int j = 1; j <= m; j++)            if(up[i][j] >= st[tp]) st[++tp] = up[i][j], ls[tp] = 1;            else {                int len = 0;                while(tp && st[tp] > up[i][j]) len += ls[tp], ans = max(ans, len*st[tp--]);                st[++tp] = up[i][j], ls[tp] = len+1;            }        int len = 0;        while(tp) len += ls[tp], ans = max(ans, st[tp--]*len);    }    cout << ans << endl;    return 0;}
原创粉丝点击