全是1的最大子矩阵

来源:互联网 发布:批处理软件 编辑:程序博客网 时间:2024/06/10 08:59
给出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,M2中的元素只有1,并且M2的面积是最大的。输出M2的面积。
Input
第1行:2个数m,n中间用空格分隔(2 <= m,n <= 500)第2 - N + 1行:每行m个数,中间用空格分隔,均为0或1。
Output
输出最大全是1的子矩阵的面积。
Input示例
3 31 1 01 1 10 1 1
Output示例

4

#include <iostream>#include <stack>using namespace std;const int MAXN = 550;int matrix[MAXN][MAXN];int len[MAXN][MAXN];int m, n;int main(){    cin >> m >> n;    for (int i = 1; i <= m; i++)    {        for (int j = 1; j <= n; j++)        {            cin >> matrix[i][j];            if (matrix[i][j] == 1)            {                len[i][j] = len[i][j-1] + 1;            }        }    }        int result = 0;    for (int j = 1; j <= n; j++)    {        stack<int> buf;        len[m+1][j] = -1;        for (int i = 1; i <= m+1; i++)        {            int temp = 0;            int top = i;            while (!buf.empty() && len[i][j] < len[buf.top()][j])            {                top = buf.top();                temp = len[top][j] * (i - top);                buf.pop();                result = max(result, temp);            }                        if (buf.empty() || len[i][j] > len[buf.top()][j])            {                buf.push(top);                len[top][j] = len[i][j];            }        }    }        cout << result << endl;    return 0;}


原创粉丝点击