• [Jobdu] 题目1497:面积最大的全1子矩阵


    题目描述:

    在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。 

    输入:

    输入可能包含多个测试样例。
    对于每个测试案例,输入的第一行是两个整数m、n(1<=m、n<=1000):代表将要输入的矩阵的大小。
    矩阵共有m行,每行有n个整数,分别是0或1,相邻两数之间严格用一个空格隔开。 

    输出:

    对应每个测试案例,输出矩阵中面积最大的全1子矩阵的元素个数。 

    样例输入:
    2 2
    0 0
    0 0
    4 4
    0 0 0 0
    0 1 1 0
    0 1 1 0
    0 0 0 0
    样例输出:
    0
    4

      可以将上述问题转化为求直方图中最大的矩形的面积,将原矩阵中的每一行视为一个直方图,对于每一行中的每一列的值为该行之上的1的个数,下面分别利用直方图的算法来求解每一行中的最大值,然后求出全局最大值。代码如下:

     1 #include <iostream>
     2 #include <stack>
     3 #include <cstdio>
     4 using namespace std;
     5  
     6 int m, n;
     7 int a[1000][1000];
     8 int b[2][1001];
     9 int f = 0;
    10  
    11 int getMax() {
    12     stack<int> s;
    13     b[f][n] = 0;
    14     int max = 0, tmp;
    15     for (int i = 0; i <= n; ++i) {
    16         if (s.empty() || b[f][s.top()] < b[f][i]) {
    17             s.push(i);
    18         } else {
    19             int idx = s.top();
    20             s.pop();
    21             tmp = b[f][idx] * (s.empty() ? i : i - s.top() - 1);
    22             max = (max > tmp) ? max : tmp;
    23             --i;
    24         }
    25     }
    26     return max;
    27 }
    28  
    29 void getRes() {
    30     int max = getMax(), tmp;
    31     ++f; f %= 2;
    32     for (int i = 1; i < m; ++i) {
    33         for (int j = 0; j < n; ++j) {
    34             b[f][j] = (a[i][j] == 0) ? 0 : b[(f+1)%2][j] + 1;
    35         }
    36         tmp = getMax();
    37         ++f; f %= 2;
    38         max = (max > tmp) ? max : tmp;
    39     }
    40     cout << max << endl;
    41 }
    42  
    43 int main() {
    44     //freopen("1497.in", "r", stdin);
    45     while (cin >> m >> n) {
    46         f = 0;
    47         for (int i = 0; i < m; ++i) {
    48             for (int j = 0; j < n; ++j) {
    49                 cin >> a[i][j];
    50                 if (i == 0)
    51                     b[0][j] = a[0][j];
    52             }
    53         }
    54         getRes();
    55     }
    56     return 0;
    57 }
    58  
    59 /**************************************************************
    60     Problem: 1497
    61     User: hupo250
    62     Language: C++
    63     Result: Accepted
    64     Time:800 ms
    65     Memory:5432 kb
    66 ****************************************************************/
  • 相关阅读:
    centos 6.4 FTP安装和配置
    常用正则表达式集锦
    同一服务器部署多个tomcat时的端口号修改详情
    介绍linux下vi命令的使用
    CentOS下安装两个或多个Tomcat7
    tomcat解析之简单web服务器(图)
    吻你
    用C++语言开发Android程序 配置开发环境
    内地开源镜像网站
    Android SDK Android NDK Android Studio 官方下载地址
  • 原文地址:https://www.cnblogs.com/easonliu/p/3890599.html
Copyright © 2020-2023  润新知