#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<cmath>
#pragma warning(disable:4996)
using std::cin;
using std::cout;
using std::endl;
using std::stringstream;
using std::string;
using std::vector;
using std::list;
using std::pair;
using std::set;
using std::multiset;
using std::map;
using std::multimap;
using std::stack;
using std::queue;
int process_row(const vector<vector<bool>>&matrix,const int &n,const int &m)
{
int area = 0;
for (int i = 0; i < n; i++)//压缩区间上界
{
for (int j = i; j < n; j++)//压缩区间下界
{
vector<pair<bool, int>>dp(m);
for (int row = i; row <= j; row++)
{
for (int column = 0; column < m; column++)
{
if (matrix[row][column])
{
dp[column].first = true;
}
}
}
int maximum = 0;
if (!dp[0].first)
{
dp[0].second++;
maximum = 1;
}
for (int k = 1; k < m; k++)
{
if (!dp[k].first)
{
if (dp[k - 1].first)
{
dp[k].second++;
}
if (!dp[k - 1].first)
{
dp[k].second = dp[k - 1].second + 1;
maximum = std::max(maximum, dp[k].second);
}
}
}
area = std::max(area, maximum*(j - i + 1));
}
}
return area;
}
int process_column(const vector<vector<bool>>&matrix, const int &n, const int &m)
{
int area = 0;
for (int i = 0; i < n; i++)//压缩区间上界
{
for (int j = i; j < n; j++)//压缩区间下界
{
vector<pair<bool, int>>dp(m);
for (int column = i; column <= j; column++)
{
for (int row = 0; row < m; row++)
{
if (matrix[row][column])
{
dp[row].first = true;
}
}
}
int maximum = 0;
if (!dp[0].first)
{
dp[0].second++;
maximum = 1;
}
for (int k = 1; k < m; k++)
{
if (!dp[k].first)
{
if (dp[k - 1].first)
{
dp[k].second++;
}
if (!dp[k - 1].first)
{
dp[k].second = dp[k - 1].second + 1;
}
maximum = std::max(maximum, dp[k].second);
}
}
area = std::max(area, maximum*(j - i + 1));
}
}
return area;
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int n,m;
while (cin>>n>>m&&n&&m)
{
vector<vector<bool>>matrix(n, (vector<bool>)m);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
short isTree; cin >> isTree;
if (isTree)
{
matrix[i][j]=true;
}
}
}
int area = 0;
area = std::max(area, process_row(matrix, n, m));
area = std::max(area, process_column(matrix, m, n));
cout << area << endl;
}
return 0;
}
UVA_10074_Take the Land
最新推荐文章于 2018-07-26 11:27:57 发布