zoukankan      html  css  js  c++  java
  • [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 ****************************************************************/
  • 相关阅读:
    Python爬虫入门之Urllib库的高级用法
    Python爬虫入门之Urllib库的基本使用
    Python中对字符串的操作
    Python2.x爬虫入门之URLError异常处理
    Python编写的记事本小程序
    Python2.X和Python3.X中Tkinter模块的文件对话框、下拉列表的不同
    记录面试龙腾简合-java开发工程师经历
    解决npm ERR! Please try running this command again as root/Administrator. 问题
    ionic3/4 使用NavController 返回两层的方式
    点击iframe窗口里的超链接,打开新页面的方式
  • 原文地址:https://www.cnblogs.com/easonliu/p/3890599.html
Copyright © 2011-2022 走看看