【训练赛】浣熊
题目描述
从前有一只可爱的小浣熊居住在美丽的森林里。他听说小鹦鹉要旅行到另一只鹦鹉家做客,也想邀请朋友们来自己家。为此,小浣熊想建一栋新房子。他找到了一块比较大的平地,不过这块地上还是有一些地方不能建屋。不妨把这块空地看作是由N行M列等大小的正方形格子组成。现在,小熊已经把不能建房子的地方都标记了出来,他想找出一块长方形的空地来建造,同时,他希望这块地的面积最大。你能帮助他么?
输入
输入第一行依次包含两个正整数N和M。
下面N行每行有M个空格隔开的数,分别描述了整块地的每一个方格的情况。每个数非0即1,若为1表示该格可以被选择,0表示该格有障碍而不能用。
下面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; }