最大全零子矩阵

【题目描述】

在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多。

【输入描述】

输入第一行为整数N,其中1<=N<=2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开。

【输出描述】

输出仅一行包含一个整数表示要求的最大的全零子矩阵中零的个数。

【样例输入】

5
0 1 0 1 0
0 0 0 0 0
0 0 0 0 1
1 0 0 0 0
0 1 0 0 0

【样例输出】

9

源代码:

#include<cstdio>
int n,ans(0),i[2001][2001],left[2001][2001],right[2001][2001],f[2001][2001]={0};
int main()
{
    scanf("%d",&n);
    for (int a=1;a<=n;a++)
    {
        scanf("%d",&i[a][1]);
        left[a][1]=i[a][1]==1?2:1; //边界。
        for (int b=2;b<=n;b++)
        {
            scanf("%d",&i[a][b]);
            if (!i[a][b]) //初始化左端。
              left[a][b]=left[a][b-1];
            else
              left[a][b]=b+1;
        }
        right[a][n]=i[a][n]==1?n-1:n; //边界。
        for (int b=n-1;b>0;b--)
          if (!i[a][b]) //初始化右端。
            right[a][b]=right[a][b+1];
          else
            right[a][b]=b-1;
    }
    for (int a=1;a<=n;a++) //边界。
      f[1][a]=i[1][a]==1?0:1;
    for (int a=2;a<=n;a++)
    {
        for (int b=1;b<=n;b++)
          if (!i[a][b])
          {
              f[a][b]=f[a-1][b]+1; //悬线法。(Orz 神犇 王知昆)
              if (!i[a-1][b]) //依据上方的点更新左端右端。
              {
                  left[a][b]=left[a][b]>left[a-1][b]?left[a][b]:left[a-1][b];
                  right[a][b]=right[a][b]<right[a-1][b]?right[a][b]:right[a-1][b];
            }
            int t=(right[a][b]-left[a][b]+1)*f[a][b]; //求最大值。
            if (t>ans)
              ans=t;
          }
    }
    printf("%d",ans);
    return 0;
} 
时间: 2024-10-09 15:07:06

最大全零子矩阵的相关文章

HDU 2830 Matrix Swapping II (DP,最大全1矩阵)

题意  给你一个n*m矩阵  每列都可以随便交换位置   求最优交换后最大的全1子矩阵 又是HDU 1505 1506的变种  但这个更容易了  因为每列都可以交换位置了   那么这一行中所有比i高的都可以与i相邻了  只需要统计这一行有多少个比i高就行了   可以在算出每一行后  把高度大的放前面去  用num[i]记录排序后的列原来的数  这样就有j列比h[i][num[j]]高了  最后的答案也就是max(j*h[i][num[j]]) #include<cstdio> #include

MATLAB命令大全和矩阵操作大全

转载自: http://blog.csdn.net/dengjianqiang2011/article/details/8753807 MATLAB矩阵操作大全 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在"[ ]"内: b.矩阵的同行元素之间用空格(或",")隔开: c.矩阵的行与行之间用";"(或回车符)隔开: d.矩阵的元素可以是数值.变量.表达式或函数: e.矩阵的尺寸不必预先定义. 二,矩阵的创建: 1.直接输

求最大全1矩阵板子

题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1157 贪心暴力 #include<iostream> #include<algorithm> using namespace std; #define maxn 1005 int a[maxn][maxn]; int h[maxn];//存该列往上有多少个1 int l[maxn],r[maxn]; int main() { int n,m; int ans=0

Codevs 1159 最大全0子矩阵 悬线法!!!!

1159 最大全0子矩阵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多. 输入描述 Input Description 输入文件第一行为整数N,其中1<=N<=2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开. 输出描述 Output Description 输出文件仅一行包含一个整数表示要求的最大的全零子矩阵中零的个数.

最大全0/1子矩阵的探究

by MedalPluS [问题模型] 给定一个n*n的矩阵,求矩阵中面积最大的一个值全是0或1的子矩阵 [分析] (这里n*n完全可以改为n*m,但由于种种原因,等下代码里是n*n) 首先很容易想到一种解法,枚举这个子矩阵的左上方,和右下方,然后暴力统计,这样时间复杂度O(N6),这种做法很广泛 这肯定是不能满足我们的需求,那么应该怎么办呢?我们发现O(n2)的时间浪费在统计上,我们可以使用前缀和的手段,预处理 这样时间复杂度O(n4),还是很垃圾 在暴力种种优化都不行的时候,想一想贪心或者数

(数组)Largest Rectangle in Histogram(栈解问题)

Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. Above is a histogram where width of each bar is 1, given heigh

【组合数学】 06 - 组合设计

计数问题其实只是组合数学中的一小部分,以上也仅仅介绍了比较经典的结论.组合问题复杂多变,它们之间也少有联系,所以把组合数学称作一门学科并不准确.组合难题也会出现在各种益智趣题或竞赛难题中,随随便便就会出现一些未解的难题,所以我们也将止步于此.在结束本课之前,我决定再窥探一下组合问题中的一大类:组合设计.这些问题的关注点在如何布局元素,以满足一些特定要求,它们已然构成了组合学的众多分支. 1. 0-1矩阵 1.1 关联矩阵的秩 有的问题需要在两个集合\(A,B\)间建立联系,如果把\(A,B\)的

【leetcode】Maximal Rectangle (hard)★

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area. 找到01矩形中最大的全1子矩阵. 我自己的思路: 我先用一个跟输入相同大小的矩阵numInCol 存储从当前位置开始向下有多少连续的1. 如 1 0 1 0 1 1 1 1 1 其numInCol 是 1 0 3 0 2 2 1 1 1 然后用一个变量tmpans

【DP/单调栈】关于单调栈的一些题目(codevs 1159,codevs 2673)

题目描述 Description 这个月的pku月赛某陈没有参加,因为当时学校在考试[某陈经常逃课,但某陈还没有强大到考试也可以逃掉的程度].何况,对于北大校赛,水牛通常是没有什么希望考得好的[事实上某陈最好成绩是仅A了一道题]. 某陈郁闷.接下来他又将沉浸在无穷尽的刷题中,每天面对各种颜色的Status--WA,TLE,RE,甚至还有MLE,CE,PE什么什么的,他无比期待蓝色的AC. 话说RP爆发的某陈弄到了很久以后某次pku月赛的某题的题目和输入数据,如下所示. 输入数据包括n个测试点,每