这题的话,和01矩阵差不多,但是每列可以移动,所以每列sort一下就可以了,因为把eof写成n!=0,tle,改了直接200ms...

#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <string> #include <stack> #include <queue> const int inf = (1<<31)-1; const int MAXN = 1e3+10; using namespace std; int dp[MAXN][MAXN]; int row[MAXN]; char s[MAXN]; int main() { int n,m,mmax,k; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n;i++){ scanf("%s",s); for(int j=1;j<=m;j++){ if(s[j-1]=='1'){ dp[i][j] = dp[i-1][j]+1; }else{ dp[i][j] = 0; } } } mmax = 0; for(int i=1;i<=n;i++){ k = 0; for(int j=1;j<=m;j++){ if(dp[i][j]) row[k++] = dp[i][j]; } sort(row,row+k); for(int j=0;j<k;j++){ mmax = max(mmax,row[j]*(k-j)); } } printf("%d ",mmax); } return 0; }
:smile: