51Nod-1157-全是1的最大子矩阵

来源:互联网 发布:淘宝我的发票在哪里看 编辑:程序博客网 时间:2024/05/17 06:15

ACM模版

描述

描述

题解

很经典的一个问题,最大 1 矩阵模板,直接套。

代码

#include <iostream>using namespace std;const int N = 105;int m, n;bool a[N][N];int Run(const int &m, const int &n)     // a[1...m][1...n]{                                       // O(m*n)    int i, j, k, l, r, max = 0;    int col[N];    for (j = 1; j <= n; j++)    {        if (a[1][j] == 0 )        {            col[j] = 0;        }        else        {            for (k = 2; k <= m && a[k][j] == 1; k++);            col[j] = k - 1;        }    }    for (i = 1; i <= m; i++)    {        if (i > 1)        {            for (j = 1; j <= n; j++)            {                if (a[i][j] == 0)                {                    col[j] = 0;                }                else                {                    if (a[i - 1][j] == 0)                    {                        for (k = i + 1; k <= m && a[k][j] == 1; k++);                        col[j] = k-1;                    }                }            }        }        for (j = 1; j <= n; j++)        {            if (col[j] >= i)            {                for (l = j - 1; l > 0 && col[l] >= col[j]; --l);                l++;                for (r = j + 1; r <= n && col[r] >= col[j]; ++r);                r--;                int res = (r - l + 1) * (col[j] - i + 1);                if( res > max )                {                    max = res;                }            }        }    }    return max;}int main(){    cin >> m >> n;    for (int i = 1; i <= m; i++)    {        for (int j = 1; j <= n; j++)        {            cin >> a[i][j];        }    }    cout << Run(m, n) << '\n';    return 0;}

参考

《最大 1 矩阵》

原创粉丝点击