codeforces 375B Maximum Submatrix 2

题意:给你一个矩阵,问你只变动行,能到到最大面积的全为‘1’ 的矩阵。

解题思路:先一行一行的求出到了这一列最长连续的1有多少,然后一列一列先hash 然后求 最大值 ,发现%1d好慢。

解题代码:

 1 // File Name: 375b.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年03月09日 星期一 21时05分00秒
 4
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 #define maxn 5005
26 using namespace std;
27 int dp[maxn][maxn];
28 int hs[maxn];
29 int main(){
30     int n , m;
31     scanf("%d %d",&n,&m);
32     getchar();
33     for(int i = 1;i <= n;i ++)
34     {
35        int sum = 0 ;
36        char tmp ;
37        for(int j = 1;j <= m ;j++  )
38        {
39            tmp = getchar();
40            if(tmp == ‘1‘ )
41                sum ++ ;
42            else sum = 0;
43            dp[i][j] = sum ;
44        }
45        getchar();
46     }
47     int mx = 0 ;
48     for(int i = 1;i <= m;i ++)
49     {
50       memset(hs,0,sizeof(hs));
51       for(int j= 1;j <= n;j ++)
52       {
53         hs[dp[j][i]] ++;
54       }
55       int tsum = 0 ;
56       for(int j = 0;j<= m;j ++)
57       {
58          if(hs[j])
59          {
60            mx = max((n - tsum ) * j ,mx);
61            tsum += hs[j];
62          }
63       }
64     }
65     printf("%d\n",mx);
66
67 return 0;
68 }

时间: 2024-10-26 06:57:39

codeforces 375B Maximum Submatrix 2的相关文章

CF 375B Maximum Submatrix 2[预处理 计数排序]

B. Maximum Submatrix 2 time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output You are given a matrix consisting of digits zero and one, its size is n × m. You are allowed to rearrange its rows. W

codeforces 375B B. Maximum Submatrix 2(dp)

题目链接: codeforces 375B 题目大意: 给出一个01矩阵,行与行之间可以互换位置,问能够得到最大的全1矩阵的面积. 题目分析: 我们有一种模型,就是对于不互换行的01矩阵求最大面积,就是固定子矩阵的右下角,记录h[i][j]就是当前位置的高度,然后向左延展的距离,枚举所有的即可. 代码如下: #include <iostream> #include <cstring> #include <cstdio> #include <algorithm>

Codeforces Round #221 (Div. 1) B. Maximum Submatrix 2 dp排序

B. Maximum Submatrix 2 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/375/B Description You are given a matrix consisting of digits zero and one, its size is n × m. You are allowed to rearrange its rows. What is

Codeforces 484B Maximum Value(高效+二分)

题目链接:Codeforces 484B Maximum Value 题目大意:给定一个序列,找到连个数ai和aj,ai%aj尽量大,并且ai≥aj 解题思路:类似于素数筛选法的方式,每次枚举aj,然后枚举k,每次用二分找到小于k?aj并且最大的ai,维护答案,过程中加了一些剪枝. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn =

codeforces 407D Largest Submatrix 3

codeforces 407D Largest Submatrix 3 题意 找出最大子矩阵,须满足矩阵内的元素互不相等. 题解 官方做法 http://codeforces.com/blog/entry/11333 \(O(n^6)\) 枚举子矩阵,暴力check. \(O(n^4)\) 枚举上下边界,双指针. \(O(n^3log_2n)\) 假设当前上边界 \(up\), 下边界 \(down\),\(R_i\) 表示当 \(i\) 为左边界时,右边界最大是 \(R_i\). 当 \(do

Maximum Submatrix &amp; Largest Rectangle

相关题型 问题一(最大和子矩阵) : 有一个 m x n 的矩阵,矩阵的元素可正可负.请找出该矩阵的一个子矩阵(方块),使得其所有元素之和在所有子矩阵中最大.(问题来源:http://acm.pku.edu.cn/JudgeOnline/problem?id=1050) 问题二( 最大 0/1 方块) :有一个 m x n 的矩阵,元素为 0 或 1.一个子矩阵,如果它所有的元素都是 0, 或者都是 1,则称其为一个 0-聚类 或 1-聚类,统称聚类(Cluster).请找出最大的聚类(元素最多

Codeforces C. Maximum Value(枚举二分)

题目描述: Maximum Value time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given a sequence a consisting of n integers. Find the maximum possible value of (integer remainder of *a**i* divi

Codeforces Round #221 (Div. 2) D. Maximum Submatrix 2 (思维题)

题目地址:codeforces 221 D 这场是人生中做的第一场CF中的D题.(当时只做出来了A题..)过年之际回顾了一下,就顺便看了几道D题.现在做CF的D题在比赛时还是做不出来.但是赛后往往都可以自己做出来.据说D题能在比赛中稳出的话就可以区域赛银了.于是争取以后CF能稳出4道题吧. 这道题刚开始不该看标签的..给的是DP..于是就一直朝着DP方向想.但是感觉不像是DP.就换了个思路,就做出来了. 大体方法是先预处理出每一行中每个数向左延伸最长的连续1的个数.然后对每一行的进行排序(我这里

CodeForces 762D Maximum path

http://codeforces.com/problemset/problem/762/D 因为是3*n很巧妙的地方是 往左走两步或更多的走法都可以用往回走以一步 并走完一列来替换 那么走的方法就大大减少 左边一列转移到右边一列 每个 格子的转移方法枚举出来 用动态规划即可解决 最主要的是因为他能够往回走.但是我们画图可以发现:每次往回走一定不用超过1次.也就是说,最多只能走成这样 而不会走成这样 因为下图的走法一定可以用上图组合,并且由于只用3行的特性,每次向回走实际上是取走了所有的数.所以