1158 全是1的最大子矩阵
收藏
关注
代码
基准时间限制:1 秒 空间限制:131072 KB 分值: 80
难度:5级算法题
![](https://file.51nod.com/images/icon/star.png)
![](https://file.51nod.com/images/icon/plus.png)
给出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,M2中的元素只有1,并且M2的面积是最大的。输出M2的面积。
Input
第1行:2个数m,n中间用空格分隔(2 <= m,n <= 500) 第2 - N + 1行:每行m个数,中间用空格分隔,均为0或1。
Output
输出最大全是1的子矩阵的面积。
Input示例
3 3 1 1 0 1 1 1 0 1 1
Output示例
4
水题 把0看作极小值 求最大子矩阵即可
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
1 #include <cstdio> 2 #include <cctype> 3 #include <iostream> 4 5 typedef long long LL; 6 7 const int INF=1000000; 8 const int MAXN=510; 9 10 int n,m; 11 12 int a[MAXN][MAXN]; 13 14 LL ans; 15 16 inline void read(int&x) { 17 int f=1;register char c=getchar(); 18 for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar()); 19 for(;isdigit(c);x=x*10+c-48,c=getchar()); 20 x=x*f; 21 } 22 23 24 int hh() { 25 read(n);read(m); 26 for(int i=1;i<=n;++i) 27 for(int j=1;j<=m;++j) { 28 read(a[i][j]); 29 if(!a[i][j]) a[i][j]=-INF; 30 a[i][j]+=a[i-1][j]; 31 } 32 for(int i=0;i<=n;++i) 33 for(int j=i+1;j<=n;++j) { 34 LL tot=0; 35 for(int k=1;k<=m;++k) { 36 if(tot<0) tot=a[j][k]-a[i][k]; 37 else tot+=a[j][k]-a[i][k]; 38 ans=tot>ans?tot:ans; 39 } 40 } 41 std::cout<<ans; 42 return 0; 43 } 44 45 int sb=hh(); 46 int main(int argc,char**argv) {;}