【训练赛】浣熊

题目描述

从前有一只可爱的小浣熊居住在美丽的森林里。他听说小鹦鹉要旅行到另一只鹦鹉家做客,也想邀请朋友们来自己家。为此,小浣熊想建一栋新房子。他找到了一块比较大的平地,不过这块地上还是有一些地方不能建屋。不妨把这块空地看作是由N行M列等大小的正方形格子组成。现在,小熊已经把不能建房子的地方都标记了出来,他想找出一块长方形的空地来建造,同时,他希望这块地的面积最大。你能帮助他么?

输入

输入第一行依次包含两个正整数N和M。
下面N行每行有M个空格隔开的数,分别描述了整块地的每一个方格的情况。每个数非0即1,若为1表示该格可以被选择,0表示该格有障碍而不能用。

输出

输出仅一行一个整数,为最大能够找到的长方形的面积。

样例输入

5 5
1 1 1 1 1
1 0 0 1 1
0 1 1 1 1
0 1 1 0 1
1 1 1 1 1

样例输出

6

提示

对于50%的数据,有1 ≤ N,M ≤ 10
对于100%的数据,有1 ≤ N,M ≤ 50

 
思路:一开始没做出来= =!后来看了队里另外一个人的代码才茅塞顿开,还有这种操作!
首先预处理矩形(处理方式见代码)
处理完毕后,样例应为:
2 0 1 3 5
1 0 0 2 4
0 3 3 1 3
0 2 2 0 2
1 1 1 1 1
后枚举每个b[i][j],再枚举k,j<=k<=m,去b[i][j]与b[i][k]中最小值,为长,宽为k-j+1,相乘则是矩形面积。
#include <iostream>
 
using namespace std;
 
int main()
{
    int n,m;
    int a[55][55]={0};
    int b[55][55]={0};
    cin>>n>>m;
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            cin>>a[i][j];
        }
    }
    for(j=1;j<=m;j++)
    {
        b[n][j]=a[n][j];
    }
    for(i=n-1;i>0;i--)
    {
        for(j=1;j<=m;j++)
        {
            if(a[i][j]!=0)
            {
                b[i][j]=b[i+1][j]+1;
            }
            else
            {
                b[i][j]=0;
            }
        }
    }
    int ans=0;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            int now=b[i][j];
            for(int k=j;k<=m;k++)
            {
                now=min(now,b[i][k]);
                ans=max(ans,now*(k-j+1));
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

  

posted @ 2018-02-07 11:13  行远山  阅读(174)  评论(0编辑  收藏  举报