这个题好像让我钻空子了。 也是求 完全是 1的子矩阵的 1的最多的个数。
方法还是 对于每一个 是 1 的位置。 先求出竖直方向连接的1的个数,然后对于每一行 非 0的排序 乘就好了。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <fstream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cmath>
#include <iomanip>
#include <cmath>
typedef long long LL;
typedef unsigned long long LLU;
const double PI=acos(-1.0);
using namespace std;
#define MAXN 1000+10
#define INF 1 << 30
char s[MAXN][MAXN],d[MAXN][MAXN];
int q[MAXN][MAXN];
int main (){
int m,n;
while(scanf("%d%d",&m,&n) != EOF){
for(int i = 1; i <= m; i++){
scanf("%s",s[i]+1);
}
memset(q,0,sizeof(q));
memset(d,0,sizeof(d));
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(s[i][j] == '0')
q[i][j] = 0;
else
q[i][j] = 1;
}
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(q[i][j])
d[i][j] = d[i-1][j] + 1;
else
d[i][j] = 0;
}
}
int ans = 0;
for(int i = 1; i<= m; i++){
vector <int> _d;
for(int j = 1; j <= n; j++)
if(d[i][j])
_d.push_back(d[i][j]);
sort(_d.begin(),_d.end());
int len = _d.size();
for(int j = 0; j < len; j++){
ans = max(ans, _d[j]*(len-j));
}
}
printf("%d\n",ans);
}
return 0;
}