`
leon_a
  • 浏览: 79047 次
  • 性别: Icon_minigender_1
  • 来自: 拜月神教
社区版块
存档分类
最新评论

最大0,1子矩阵

J# 
阅读更多
首先描述一下问题
 /**
 * 
 * 时间限制(普通/Java):6000MS/20000MS 运行内存限制:65536KByte
 * 总提交:131 测试通过:32
 * 描述
 * 在一个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
 */

我的做法是遍历每个点,根据每个点横向和纵向的构造全0矩阵,选取最大的全0矩阵输出
正确性应该是没问题的,不过时间复杂度
遍历的复杂度是o(n^2)然后每个点构造矩形复杂度也是o(n^2)
最大时间复杂度就为n^4
因此求优化
package graph;
/**
 * 
 * 时间限制(普通/Java):6000MS/20000MS 运行内存限制:65536KByte
 * 总提交:131 测试通过:32
 * 描述
 * 在一个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
 * 
 * @author Leon.Chen
 *
 */
public class AllZeroMatrix {
	/**
	 * 输入矩阵
	 */
	public int[][] matrix;
	/**
	 * 矩阵最大行
	 */
	public int maxRow;
	/**
	 * 矩阵最大列
	 */
	public int maxColumn;
	/**
	 * 被乘数
	 */
	public int multiplicand;
	/**
	 * 最大全零矩阵
	 */
	public int totalCount;

	/**
	 * 每个点向下,向右扩张矩形,取最大的矩形
	 * 
	 * @param row
	 * @param column
	 */
	public void spread(int row, int column) {
		int rowStart = row;
		int rowEnd = row;
		while (rowEnd < maxRow) {
			if (matrix[rowEnd][column] == 0) {
				rowEnd++;
			} else {
				break;
			}
		}
		this.multiplicand = 0;
		spreadMatrixRight(rowStart, rowEnd, column);
		int count = (rowEnd - rowStart) * multiplicand;
		if (totalCount < count) {
			totalCount = count;
		}
		int columnStart = column;
		int columnEnd = column;
		while (columnEnd < maxColumn) {
			if (matrix[row][columnEnd] == 0) {
				columnEnd++;
			} else {
				break;
			}
		}
		this.multiplicand = 0;
		spreadMatrixbelow(columnStart, columnEnd, row);
		count = (columnEnd - columnStart) * multiplicand;
		if (totalCount < count) {
			totalCount = count;
		}
	}

	/**
	 * 矩阵的向右扩张
	 * 
	 * @param start
	 * @param end
	 * @param column
	 */

	public void spreadMatrixRight(int start, int end, int column) {
		boolean flg = true;
		for (int i = start; i < end; i++) {
			if (matrix[i][column] == 1) {
				flg = false;
				break;
			}
		}
		if (flg) {
			multiplicand++;
			int nextColumn = column;
			nextColumn++;
			if (nextColumn < maxColumn) {
				spreadMatrixRight(start, end, nextColumn);
			}
		}
	}

	/**
	 * 矩阵的向下扩张
	 * 
	 * @param start
	 * @param end
	 * @param row
	 */
	public void spreadMatrixbelow(int start, int end, int row) {
		boolean flg = true;
		for (int i = start; i < end; i++) {
			if (matrix[row][i] == 1) {
				flg = false;
				break;
			}
		}
		if (flg) {
			multiplicand++;
			int nextRow = row;
			nextRow++;
			if (nextRow < maxRow) {
				spreadMatrixbelow(start, end, nextRow);
			}
		}
	}

	/**
	 * 得到最大全零矩阵的大小
	 * 
	 * @param printMatrix
	 */
	public void getAllZeroMatrix(int[][] printMatrix) {
		matrix = printMatrix;
		maxRow = matrix.length;
		maxColumn = matrix[0].length;
		for (int i = 0; i < maxRow; i++) {
			for (int j = 0; j < maxColumn; j++) {
				int count = (maxRow - i) * (maxColumn - j);
				if (count <= totalCount) {
					continue;
				}
				if (matrix[i][j] != 1) {
					spread(i, j);
				}
			}
		}
		System.out.println(totalCount);
	}
	
	public static void main(String[] args) {
		int[][] printMatrix = new int[][]{
				{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},
		};
		long start = System.currentTimeMillis();
		new AllZeroMatrix().getAllZeroMatrix(printMatrix);
		long end = System.currentTimeMillis();
		System.out.println((end-start)+"ms");
	}
}

4
2
分享到:
评论

相关推荐

    最大子矩阵和问题.pdf最大子矩阵和问题.pdf

    给定一个`n×n`(其中`0≤100`)的矩阵,任务是找到该矩阵中的一个子矩阵,使得该子矩阵所有元素之和最大,并输出这个最大值。 #### 三、示例分析 考虑以下矩阵: ``` 0 0 0 0 -2 -2 -2 -2 -7 -7 -7 -7 0 0 0 0 9...

    C++实现的最大子矩阵和

    在计算机科学中,最大子矩阵和问题是一个经典的算法问题,主要涉及到数组处理和动态规划。在二维数组(矩阵)中,我们需要找出一个矩形子矩阵,使得其所有元素之和最大。这个问题在处理大规模数据、图像处理以及金融...

    最大子矩阵.最大子矩阵ppt

    根据给定文件的信息,本文将围绕“最大子矩阵”这一主题进行深入探讨,涉及的知识点主要包括最大子矩阵的概念、最大子区间和问题及其算法实现、最大子矩形问题及其求解方法。 ### 一、最大子矩阵概述 最大子矩阵...

    游泳圈的最大子矩阵和

    ### 游泳圈的最大子矩阵和 #### 问题描述 在一个二维数组中,其边界条件类似于游泳圈(即数组的边缘相连),如何找到该数组中的最大子矩阵和?这里的最大子矩阵指的是所有可能的子矩阵中元素之和最大的一个。 ####...

    最大子段和最大子矩阵 最大子长方体

    2. 变形 1:最大子矩阵和 这个问题可以转化成一维的最大子段和问题。我们可以先统计 sum[i][j]:第 i 行,从开头到第 j 个元素的总值。这样,第 i 行从第 j 个元素到第 k 个元素的总价值就是 sum[i][k] - sum[i][j ...

    最大子矩阵.pdf最大子矩阵.pdf最大子矩阵.pdf

    - **初始化变量**:设置`maxSum`为0,用于记录最大子矩阵的元素之和;同时初始化起始和终止位置变量。 - **循环遍历不同高度**:从1到矩阵的行数n,遍历所有可能的高度。 - **遍历顶部行**:对于每个高度,遍历所有...

    最大子矩阵和

    在计算机科学领域,最大子矩阵和问题是一个经典的算法问题,主要涉及到数组处理和动态规划技术。本问题的目标是找到一个二维矩阵中的连续子矩阵,使得该子矩阵的所有元素之和最大。这个问题在实际应用中有着广泛的...

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

    1. 首先,计算每一行的最大子矩阵和,这可以通过遍历每一行并应用 Kadane's Algorithm 来实现。 2. 然后,我们再遍历整个矩阵,对于每个元素 (i, j),我们维护两个值:当前列的最大子矩阵和(max_col)以及以当前...

    最大子矩阵和.docx

    1. **最大子段和问题**:在解决最大子矩阵问题之前,先理解最大子段和问题是非常重要的。给定一个数组`a[1..n]`,目标是找到数组的一个连续子段,使得该子段的元素之和最大。这个问题可以通过动态规划的方法解决,...

    子矩阵的大小,设矩阵的大小为矩阵中所有元素的和,现输入一个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...

    最大子矩阵和的N6、N4、N3次算法

    1  i  m  N and 1  j  n  N . For convenience, the maximum submatrix sum is 0 if all the integers are negative. Example: For matrix and has the sum of 15. 0270 9262 92 ...

    最大子矩阵和问题.doc

    1. 初始化最大值 `sum` 为 0。 2. 创建一个长度为 \(n\) 的数组 \(B\)。 3. 对于每一对行 \(i\) 和 \(j\)(其中 \(i \leq j\)): - 将 \(B\) 中的所有元素置为 0。 - 对于每列 \(k\),将矩阵第 \(j\) 行的第 \(k\...

    C++求最佳子矩阵代码

    1. **初始化**:创建两个变量,`max_sum` 用于存储当前找到的最大子矩阵和,`current_sum` 用于存储遍历过程中子矩阵的和。 2. **遍历**:对于矩阵的每一行i,从第一列j到最后一列j,进行以下操作: - 对于每一列j...

    MaxSubMat_最大子矩阵_算法设计_动态规划_

    最大子矩阵问题是一个经典的计算机科学问题,主要涉及矩阵计算与算法设计,特别是动态规划的应用。在数据结构和算法的学习中,解决这类问题的能力是衡量一个程序员能力的重要指标。本问题的目标是找到一个矩阵中元素...

    最大子矩阵问题实例解析

    【最大子矩阵问题】是一个经典的计算机算法问题,主要目的是找到给定二维矩阵中具有最大和的子矩阵。这个问题的关键在于如何有效地求解不同大小和位置的子矩阵的和,并找到全局的最大值。以下是对该问题的详细解释:...

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

    实验5.4的主题是求解最大子序列和以及最大子矩阵的问题,这涉及到经典的动态规划算法。最大子序列和问题是一维数组中最长的连续子序列,使得子序列的和最大。最大子矩阵和问题是在二维矩阵中找到一个矩形区域,其...

    python找出最大子矩阵代码.rar

    本资源“python找出最大子矩阵代码.rar”显然包含了用于寻找矩阵中最大子矩阵的算法实现。最大子矩阵问题通常指的是寻找一个矩形子矩阵,其所有元素之和达到最大值。这个问题在计算机科学中有着广泛的应用,例如在...

    C++最大子矩阵和暴力题解

    《C++实现最大子矩阵和的暴力算法解析》 在计算机科学中,处理二维数组,尤其是矩阵的问题常常出现在算法竞赛和实际应用中。本篇文章将深入探讨如何使用C++编程语言,通过暴力搜索方法解决“最大子矩阵和”的问题。...

    最大子矩阵(信息学奥赛一本通-T1282).rar

    1. 初始化:先处理第一行,计算每列的最大乘积,存入DP[0][j]。 2. 对于每一行i (1 ),遍历每列j (0 ): - 初始化临时变量temp,用于存储当前行与前一行的子矩阵乘积。 - 从左到右扫描,对于每个元素A[i][j],更新...

Global site tag (gtag.js) - Google Analytics