牛客提高D4t1 麻将

分析

我们对于每一个点记录他所在的这一行以它为右端点向前最多有几个连续的1

之后我们考虑每一列

对每一列的点按照之前求出的值从小到大排序

一次考虑每一个宽度

而高度也可以很容易的求出

每次取最大值即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int n,m,g[5010][5010],f[5010][5010],d[5010],ans,res;
int main(){
    int i,j,k;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
      for(j=1;j<=m;j++)
        scanf("%d",&g[i][j]);
    for(i=1;i<=n;i++)
      for(j=1;j<=m;j++)
        f[i][j]=(g[i][j]?f[i][j-1]+1:0);
    for(i=1;i<=m;i++){
      for(j=1;j<=n;j++)d[j]=f[j][i];
      sort(d+1,d+n+1);
      for(j=1;j<=n;j++)
        res=max(res,(n-j+1)*d[j]);
      ans=max(ans,res);
    }
    cout<<ans<<"\n";
    return 0;
}
posted @ 2019-08-24 19:32  水题收割者  阅读(105)  评论(0编辑  收藏  举报