`

最大0 1矩阵

J# 
阅读更多

题目来源:http://acm.nuaa.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1017

 

最大0,1子矩阵

Time Limit(Common/Java):6000MS/20000MS          Memory Limit:65536KByte
Total Submit:600            Accepted:123

Description

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

Input

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

Output

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

Sample Input

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


Sample Output

9

Source

Narashy

 

解题思路:

用h[j]记录第j列到当前行的连续0的个数
用l[j]记录当前行 <=j列的不小于h[j]的位置。初始值:l[j]=j;
用r[j]记录当前行 >=j 列的不小于h[j]的列位置。初始值:r[j]=j;
则在每一行的每一个不小于h[j]的最大面积为h[j]*(r[j]-l[j]+1);
全局最大面积则产生所有的h[j]里。复杂度O(n^2)

 

代码:

#include <iostream>
#include <stdio.h>
#define N 2001
int  a[N][N];
int h[N];
int l[N];
int r[N];
int main()
{
    int n;
    int i, j ,k;

    while(scanf("%d",&n)!= EOF)
    {
        for ( i = 1; i<= n; ++i )
           for ( j = 1; j <= n; ++j)
            scanf("%d", &a[i][j]);
        for ( i = 1; i <= n; ++i )
            h[i] = 0;
        int ans = 0;
        for ( i = 1; i <= n; ++i )
        {
            for ( j = 1; j <= n; ++j )
            {
                if ( a[i][j] )
                    h[j] = 0;
                else
                    ++h[j];
            }

            for ( j = 1; j <= n; ++j )
            {
                l[j] = j;
                while ( l[j] -1 >= 1 && h[l[j] - 1] >= h[j] )
                    l[j] = l[l[j] - 1];
            } 

            for ( j = n; j >= 1; --j )
            {
                r[j] = j;
                while ( r[j] + 1 <= n && h[r[j]+1] >= h[j] )
                   r[j] = r[r[j]+1];
            }

            for ( j = 1; j <= n; ++j )
            {
                int t = (r[j]-l[j]+1)*h[j];
                if ( t > ans )
                    ans = t;
            }
        }
        printf("%d\n", ans);

    }
    return 0;
}
 

 

 

分享到:
评论

相关推荐

    子矩阵的大小,设矩阵的大小为矩阵中所有元素的和,现输入一个N*N的矩阵,请设计算法计算最大的非空(大小至少是1*1)子矩阵的大小

    设矩阵的大小为矩阵中所有元素的和,现输入一个N*N的矩阵,请设计算法计算最大的非空(大小至少是1*1)子矩阵的大小。 例如4×4的矩阵为: 1 0 1 1 1 1 1 1 1 1 1 1 0 1 -6 -8 其最大子矩阵为: 1 0 1 1 1 1 1 1 1 1...

    c++深度优先搜索的回溯法实现多集合矩阵互斥问题

    给定1个1000行×20列的0-1矩阵,对于该矩阵的任意1列,其中值为1的元素的数量不超过10%。设有两个非空集合A和B,每个集合由矩阵的若干列组成。集合A和B互斥是指对于矩阵的任意一行,同时满足下列2个条件:1)若A中有...

    MATLAB针对数组或矩阵的行列归一化处理(0-1)代码

    对数组或矩阵进行逐行或者逐列归一化处理(0-1),消除不同数据的量纲带来的误差,便与数据分析和回归方程建立,观察变量间变化趋势。

    求一矩阵中子矩阵的最大和

    35. 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5 3 要求:(1)写出算法;(2)分析时间复杂度;

    实现产生随机矩阵

    ③ 求C矩阵中元素的最大值和下标。 ④ 以下三角形式显示A,上三角形式显示B。 ⑤ 将矩阵B第一行与第三行对应元素交换位置并输出。 注:java中可以调用Math. random()函数生成一个大于0,小于1的数值。 要求:类名称...

    ML之MIC:利用某数据集计算机最大信息系数MIC并可视化MIC矩阵热图及其代码实现

    ML之MIC:利用某数据集计算机最大信息系数MIC并可视化MIC矩阵热图及其代码实现 目录 利用某数据集计算机最大信息系数MIC并可视化MIC矩阵热图及其代码实现 实现结果 实现代码 利用某数据集计算机最大信息系数MIC并...

    用C语言求解N阶线性矩阵方程Ax=b的简单解法

    4. #define dim 10 //定义最大的维数10,为防止计算值溢出 5. double a[dim+1][dim+1],b[dim+1],x[dim+1]; //定义双精度数组 6. double temp; 7. double getarray(int n); //定义输入矩阵元素的函数 8. double ...

    MATLAB数组运算之矩阵

    matlab 法则定义的; 数组运算是按数组的元素逐个进行的。 1. 矩阵运算的函数 ... RCOND = 1.541976e-018.ans = 1.0e+016 * -0.4504 0.9007 -0.4504 0.9007 -1.8014 0.9007 -0.4504 0.9007 -0.4504 矩阵数组

    稀疏矩阵的三元组顺序表存储表示及其转置算法

    #define MAXSIZE 100 //非零元个数最大为100 typedef struct {int i,j; //非零元的行下标和列下标 ElemType e; //非零元 }Triple; typedef struct {Triple data[MAXSIZE+1]; //非零元三元组表,data[0]不用 int ...

    矩阵最优路径

    从矩阵最左上角位置移动到最右下角位置(每次只能向右或向下移动一步),每移动一次要相应加上矩阵元素上的能量值,基础能量值为2000,中途若能量值小于0便认定死亡,挑战不成功;求所有满足条件的路径;求能量值...

    n维矩阵的最大值和最小值:确定一个n维矩阵的最大值/最小值及其索引位置-matlab开发

    确定 n 维的最小值/最大值及其索引矩阵。 例如,对于2D矩阵,x和y位置的最小/最大值为返回,对于3D矩阵,返回最小/最大值的... % v1 = 0,而 idx1 = [3,1,3] % v2 = 2, idx2 = [1,3,1] % 是 A(3,1,3) = 0 % 是 A(1,3,1)

    MATLAB矩阵和数组运算.docx

    rank(X) 求矩阵的秩,得出的行列式不为零的最大方阵边长。 rank(a) ans = 2 inv(X) 求矩阵的逆阵,当方阵X的det(X)不等于零,逆阵X-1才存在。X 与X-1相乘为单位矩阵。 inv(a ) Warning: Matrix is close to ...

    一维动态数组实现的矩阵类

    1、下标都是从0开始,数学课上矩阵下标都是从1开始,但是工作后习惯0开始,矩阵M的第一个元素是M(0,0) 2、类型定死为double,原来作业是模板类,由于vc6对模版支持不好,另矩阵计算double类比较理想、整型几乎只能...

    c++深度优先搜索实现矩阵互斥问题

    给定1个1000行×20列的0-1矩阵,对于该矩阵的任意1列,其中值为1的元素的数量不超过10%。设有两个非空集合A和B,每个集合由矩阵的若干列组成。集合A和B互斥是指对于矩阵的任意一行,同时满足下列2个条件:1)若A中有...

    矩阵特征值求解1

    程序输出:幂法:矩阵最大特征值特征向量运行时间A1020.046724[0.539287451525195, 0.39030024190089235, 0.39

    西南交通大学-算法分析与设计-实验5.4实验报告包含预习部分-求最大子序列-求最大子矩阵

    1. 将矩阵的某一行看成一个序列,设计算法求该序列的最大子序列。 2. 将矩阵相邻两行对应列的元素相加形成一个新的序列,试分析该子序列中每-一个元素的含义,其最大子序列的含义。 3. 设计算法求解该问题,分析样例...

    论文研究- 判断矩阵的一致性检验与误差分析.pdf

    论文研究- 判断矩阵的一致性检验与误差分析.pdf, 一、一致性指标μ与相对误差δ_(ij)的分布关系 在层次分析法中,关于判断矩阵的一致性指标μ有如下定理:若正互反矩阵A=(α_(ij))_(n×n)最大特征根对应的正特征向量W...

    论文研究-一种基于矩阵的频繁项集更新算法.pdf

    该算法首先以时间为基准将更新后的数据库分为原数据库和新增数据库,分别将它们转换为0-1矩阵,通过矩阵裁剪、位运算产生新增频繁项集,并利用已有频繁项集更新原有频繁项集。实验仿真结果不但证明了该算法的可行性...

    四元数与旋转矩阵1

    任意向量绕旋转轴单位向量旋转角度,可用四元数表示: 有旋转矩阵计算四元数若 限定,有,求得 若 因为,所以至少有一个大于0即当中最大的大于0,因此根

    稀疏矩阵实验报告.doc

    测试结果: M= 0 0 4 0 0 3 7 0 0 0 0 5 0 8 0 4 0 0 2 10 N= 0 0 0 6 0 7 0 0 9 0 4 0 0 0 8 5.附录: 源程序: Matrix.h //函数申明 #include&lt;stdio.h&gt; #define MAXSIZE 100 //非零元个数的最大值 typedef struct...

Global site tag (gtag.js) - Google Analytics