测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A34897. 最大空白区

填空题 较难

题目描述

最大空白区

题目描述:

小明有一张矩形彩纸,他将彩纸均匀的画了N*M个小方格,有些小方格中被他画了小草,有些小方格是空白的,现小明想找出一片空白的方格,并且这片空白方格是最大的矩形。

现给出N和M的值,及每个方格的状态,被画小草的小方格用数字1表示,空白小方格用数字0表示,请帮小明找出最大矩形,并输出最大矩形由多少个小方格组成。

例如:N=4,M=5,

输入描述:

第一行输入两个正整数N和M(2≤N≤100,2≤M≤100),分别表示矩形彩纸方格的行数和列数,两个正整数之间以一个空格隔开

第二行开始,输入N行,每行M个正整数(正整数为1或者0),1表示小草,0表示空白,正整数之间一个空格隔开

输出描述:

输出一个整数,表示最大矩形由多少个小方格组成

样例输入:

4 5

1 1 0 0 0

1 0 1 0 0

0 0 0 1 1

0 0 0 1 0

样例输出:

6

参考答案

#include<iostream> #include<vector> #include<stack> using namespace std; const int N = 50; int a[N][N]; int main() { int n, m; cin >> n >> m; vector<vector<int> > gl(n, vector<int>(m, 0)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j]; if (a[i][j] == 0) gl[i][j] = (j == 0 ? 1 : gl[i][j - 1] + 1); } } int res = 0; for (int j = 0; j < m; j++) { vector<int> up(n, 0), down(n, 0); stack<int> st; for (int i = 0; i < n; i++) { while (!st.empty() && gl[st.top()][j] >= gl[i][j]) { st.pop(); } up[i] = st.empty() ? -1 : st.top(); st.push(i); } st = stack<int> (); for (int i = n - 1; i >= 0; i--) { while(!st.empty() && gl[st.top()][j] >= gl[i][j]) { st.pop(); } down[i] = st.empty() ? n : st.top(); st.push(i); } for (int i = 0; i < n; i++) { int height = down[i] - up[i] - 1; int area = height * gl[i][j]; res = max(res, area); } } cout << res; return 0; }

答案解析

评分标准:  

4分:能正确输出第一组数据;

4分:能正确输出第二组数据;

4分:能正确输出第三组数据;

4分:能正确输出第四组数据;

4分:能正确输出第五组数据;

5分:能正确输出第六组数据。

上一题 下一题