【HDOJ】2830 Matrix Swapping II
简单DP。
1 /* 2830 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <algorithm> 10 #include <cstdio> 11 #include <cmath> 12 #include <ctime> 13 #include <cstring> 14 #include <climits> 15 #include <cctype> 16 #include <cassert> 17 using namespace std; 18 19 const int maxn = 1005; 20 char M[maxn][maxn]; 21 int mlen[maxn][maxn]; 22 int cnt[maxn]; 23 int n, m; 24 25 int main() { 26 int i, j, k; 27 int ans, mx, tmp; 28 29 #ifndef ONLINE_JUDGE 30 freopen("data.in", "r", stdin); 31 freopen("data.out", "w", stdout); 32 #endif 33 34 while (scanf("%d %d", &n, &m) != EOF) { 35 for (i=1; i<=n; ++i) { 36 scanf("%s", M[i]+1); 37 for (j=1; j<=m; ++j) 38 M[i][j] -= '0'; 39 } 40 for (j=1; j<=m; ++j) { 41 mlen[j][0] = 0; 42 for (i=1; i<=n; ++i) { 43 if (M[i][j]) 44 mlen[j][i] = mlen[j][i-1]+1; 45 else 46 mlen[j][i] = 0; 47 } 48 } 49 50 ans = 0; 51 for (i=1; i<=n; ++i) { 52 memset(cnt, 0, sizeof(cnt)); 53 mx = -1; 54 for (j=1; j<=m; ++j) { 55 ++cnt[mlen[j][i]]; 56 mx = max(mx, mlen[j][i]); 57 } 58 for (j=mx; j>0; --j) { 59 ans = max(ans, cnt[j]*j); 60 cnt[j-1] += cnt[j]; 61 } 62 } 63 printf("%d\n", ans); 64 } 65 66 #ifndef ONLINE_JUDGE 67 printf("time = %d.\n", (int)clock()); 68 #endif 69 70 return 0; 71 }