首先描述一下问题
/**
*
* 时间限制(普通/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");
}
}
分享到:
相关推荐
给定一个`n×n`(其中`0≤100`)的矩阵,任务是找到该矩阵中的一个子矩阵,使得该子矩阵所有元素之和最大,并输出这个最大值。 #### 三、示例分析 考虑以下矩阵: ``` 0 0 0 0 -2 -2 -2 -2 -7 -7 -7 -7 0 0 0 0 9...
在计算机科学中,最大子矩阵和问题是一个经典的算法问题,主要涉及到数组处理和动态规划。在二维数组(矩阵)中,我们需要找出一个矩形子矩阵,使得其所有元素之和最大。这个问题在处理大规模数据、图像处理以及金融...
根据给定文件的信息,本文将围绕“最大子矩阵”这一主题进行深入探讨,涉及的知识点主要包括最大子矩阵的概念、最大子区间和问题及其算法实现、最大子矩形问题及其求解方法。 ### 一、最大子矩阵概述 最大子矩阵...
### 游泳圈的最大子矩阵和 #### 问题描述 在一个二维数组中,其边界条件类似于游泳圈(即数组的边缘相连),如何找到该数组中的最大子矩阵和?这里的最大子矩阵指的是所有可能的子矩阵中元素之和最大的一个。 ####...
2. 变形 1:最大子矩阵和 这个问题可以转化成一维的最大子段和问题。我们可以先统计 sum[i][j]:第 i 行,从开头到第 j 个元素的总值。这样,第 i 行从第 j 个元素到第 k 个元素的总价值就是 sum[i][k] - sum[i][j ...
- **初始化变量**:设置`maxSum`为0,用于记录最大子矩阵的元素之和;同时初始化起始和终止位置变量。 - **循环遍历不同高度**:从1到矩阵的行数n,遍历所有可能的高度。 - **遍历顶部行**:对于每个高度,遍历所有...
在计算机科学领域,最大子矩阵和问题是一个经典的算法问题,主要涉及到数组处理和动态规划技术。本问题的目标是找到一个二维矩阵中的连续子矩阵,使得该子矩阵的所有元素之和最大。这个问题在实际应用中有着广泛的...
1. 首先,计算每一行的最大子矩阵和,这可以通过遍历每一行并应用 Kadane's Algorithm 来实现。 2. 然后,我们再遍历整个矩阵,对于每个元素 (i, j),我们维护两个值:当前列的最大子矩阵和(max_col)以及以当前...
1. **最大子段和问题**:在解决最大子矩阵问题之前,先理解最大子段和问题是非常重要的。给定一个数组`a[1..n]`,目标是找到数组的一个连续子段,使得该子段的元素之和最大。这个问题可以通过动态规划的方法解决,...
设矩阵的大小为矩阵中所有元素的和,现输入一个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...
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. 0270 9262 92 ...
1. 初始化最大值 `sum` 为 0。 2. 创建一个长度为 \(n\) 的数组 \(B\)。 3. 对于每一对行 \(i\) 和 \(j\)(其中 \(i \leq j\)): - 将 \(B\) 中的所有元素置为 0。 - 对于每列 \(k\),将矩阵第 \(j\) 行的第 \(k\...
1. **初始化**:创建两个变量,`max_sum` 用于存储当前找到的最大子矩阵和,`current_sum` 用于存储遍历过程中子矩阵的和。 2. **遍历**:对于矩阵的每一行i,从第一列j到最后一列j,进行以下操作: - 对于每一列j...
最大子矩阵问题是一个经典的计算机科学问题,主要涉及矩阵计算与算法设计,特别是动态规划的应用。在数据结构和算法的学习中,解决这类问题的能力是衡量一个程序员能力的重要指标。本问题的目标是找到一个矩阵中元素...
【最大子矩阵问题】是一个经典的计算机算法问题,主要目的是找到给定二维矩阵中具有最大和的子矩阵。这个问题的关键在于如何有效地求解不同大小和位置的子矩阵的和,并找到全局的最大值。以下是对该问题的详细解释:...
实验5.4的主题是求解最大子序列和以及最大子矩阵的问题,这涉及到经典的动态规划算法。最大子序列和问题是一维数组中最长的连续子序列,使得子序列的和最大。最大子矩阵和问题是在二维矩阵中找到一个矩形区域,其...
本资源“python找出最大子矩阵代码.rar”显然包含了用于寻找矩阵中最大子矩阵的算法实现。最大子矩阵问题通常指的是寻找一个矩形子矩阵,其所有元素之和达到最大值。这个问题在计算机科学中有着广泛的应用,例如在...
《C++实现最大子矩阵和的暴力算法解析》 在计算机科学中,处理二维数组,尤其是矩阵的问题常常出现在算法竞赛和实际应用中。本篇文章将深入探讨如何使用C++编程语言,通过暴力搜索方法解决“最大子矩阵和”的问题。...
1. 初始化:先处理第一行,计算每列的最大乘积,存入DP[0][j]。 2. 对于每一行i (1 ),遍历每列j (0 ): - 初始化临时变量temp,用于存储当前行与前一行的子矩阵乘积。 - 从左到右扫描,对于每个元素A[i][j],更新...