POJ3494 - Largest Submatrix of All 1’s - 二维单调栈

1.题目描述:

Largest Submatrix of All 1’s
Time Limit: 5000MS   Memory Limit: 131072K
Total Submissions: 6398   Accepted: 2365
Case Time Limit: 2000MS

Description

Given a m-by-n (0,1)-matrix, of all its submatrices of all 1’s which is the largest? By largest we mean that the submatrix has the most elements.

Input

The input contains multiple test cases. Each test case begins with m and n (1 ≤ mn ≤ 2000) on line. Then come the elements of a (0,1)-matrix in row-major order on m lines each with n numbers. The input ends once EOF is met.

Output

For each test case, output one line containing the number of elements of the largest submatrix of all 1’s. If the given matrix is of all 0’s, output 0.

Sample Input

2 2
0 0
0 0
4 4
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0

Sample Output

0
4

Source

POJ Founder Monthly Contest – 2008.01.31, xfxyjwf
2.题意概述:

给出一个m*n的01矩阵,问在系数全为1的子矩阵中 系数和的最大值。

3.解题思路:

观察容易发现,每一行其实就是POJ2559的翻版,对于高度就相当于延伸上一行的1。同样用一个单调栈维护一下,记录一下最大值即可。

4.AC代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define INF 0x7fffffff
#define maxn 1010000
#define eps 1e-6
#define pi acos(-1.0)
#define e 2.718281828459
#define mod (int)1e9 + 7;
using namespace std;
typedef long long ll;
int h[maxn];
struct node
{
  int h, sta;
} s[maxn];
int t, ans, top, n, m;
int main()
{
#ifndef ONLINE_JUDGE
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
  long _begin_time = clock();
#endif
  while (scanf("%d%d", &n, &m) == 2)
  {
    memset(h, 0, sizeof(h));
    ans = 0;
    for (int i = 1; i <= n; ++i)
    {
      for (int j = 1; j <= m; ++j)
      {
        int x;
        scanf("%d", &x);
        h[j] = x == 0 ? 0 : h[j] + 1;
      }

      t = m;
      h[++t] = -1;
      s[0].h = -1;
      s[0].sta = top = 0;
      for (int k = 1; k <= t; ++k)
      {
        if (h[k] >= s[top].h)
        {
          s[++top].h = h[k];
          s[top].sta = k;
        }
        else
        {
          while (h[k] < s[top].h)
          {
            ans = max(ans, (k - s[top].sta) * s[top].h);
            --top;
          }
          s[++top].h = h[k];
        }
      }
    }
    printf("%d\n", ans);
  }

#ifndef ONLINE_JUDGE
  long _end_time = clock();
  printf("time = %ld ms\n", _end_time - _begin_time);
#endif

  return 0;
}

你可能感兴趣的:(单调栈)