Codeforces Round #221 (Div. 1) B. Maximum Submatrix 2 DP

链接:

http://codeforces.com/contest/375/problem/B

题意:

给出一个01矩阵,行与行之间可以互换位置,问能够得到最大的全1矩阵的面积。

题解:

定义dp[i][j]表示从i开始长度为j的有多少个

然后再求一下后缀,即dp[i][j]表示从i开始长度大于等于j的有多少个

最后遍历一下dp数组就可以了

开始的时候我是把每个起点的单独的放到vector里面,然后排序,结果tle在40个样例。。

代码:

31 int n, m;
32 VI v[MAXN];
33 int last[MAXN];
34 int dp[MAXN][MAXN];
35 
36 bool cmp(int a, int b) {
37     return a > b;
38 }
39 
40 int main() {
41     ios::sync_with_stdio(false), cin.tie(0);
42     cin >> n >> m;
43     rep(i, 0, n) {    
44         string s;
45         cin >> s;
46         memset(last, 0, sizeof(last));
47         per(i, 0, m) {
48             if (s[i] == '1') last[i] = last[i + 1] + 1;
49             else last[i] = 0;
50         }
51         rep(i, 0, m) if (last[i]) dp[i][last[i]]++;
52     }
53     int ans = 0;
54     rep(i, 0, m) per(j, 1, m) dp[i][j] += dp[i][j + 1];
55     rep(i, 0, m) rep(j, 1, m + 1) ans = max(ans, j*dp[i][j]);
56     cout << ans << endl;
57     return 0;
58 }

 

posted @ 2017-08-11 23:55  Flowersea  阅读(157)  评论(0编辑  收藏  举报