当前位置: 首页 > 知识库问答 >
问题:

具有所有1的最大大小矩形二进制子矩阵

董庆
2023-03-14

我用直方图解决方案编写了这段代码,但用户将输入其矩阵,而不是在代码上输入矩阵。现在看看我做错了什么,除了柱状图的数学之外,一切似乎都正常。我做错了什么?

用户将输入行和列,然后一个接一个地输入矩阵中的每个值。然后代码将显示矩阵并计算所有1的最大大小矩形二进制子矩阵。

#include <stdio.h>
#include <bits/stdc++.h>
#include <iostream>

using namespace std;
 
#define MAXROW      100
#define MAXCOL      100
 
int maxHist(int row[]){
        stack<int> result; 
    int top_val;
    int max_area = 0;
    int area = 0; 
    int a = 0; 
    while (a < MAXCOL) 
   { 
       if (result.empty() || row[result.top()] <= row[a]) 
            result.push(a++); 
        else
        { 
            top_val = row[result.top()]; 
            result.pop(); 
            area = top_val * a; 
            if (!result.empty()) 
                area = top_val * (a - result.top() - 1 ); 
           max_area = max(area, max_area); 
        } 
    } 
    while (!result.empty()) 
    { 
      top_val = row[result.top()]; 
       result.pop(); 
       area = top_val * a; 
       if (!result.empty()) 
            area = top_val * (a - result.top() - 1 ); 
        max_area = max(area, max_area); 
    } 
    return max_area; 
}
int maxRectangle(int A[][MAXCOL])  {
        int result = maxHist(A[0]); 
    for (int a = 1; a < MAXROW; a++) 
    { 
        for (int b = 0; b < MAXCOL; b++) 
            if (A[a][b]) A[a][b] += A[a - 1][b]; 
        result = max(result, maxHist(A[a])); 
    } 
    return result; 
}
 
int main(){
    int matrix[MAXROW][MAXCOL];
    int i,j,x,y
    ;
    cout << "Numero de linhas na matrix: ";
    cin >> i;
    cout << "Numero de colunas na matrix: ";
    cin >> j;
    float l[i][j];
    int p = 0, q = 0;
    while (p < i) {
        while (q < j) {
          cout << "Entre o valor [" << p + 1 << "," << q + 1 << "] da matrix: ";
          cin >> l[p][q];
          q = q + 1;
        }
        p = p + 1;
        q = 0;
    }
    int A[][MAXCOL] = { l[p][q]}; 
    cout << "\nA matrix e:\n ";
    for(x=0;x< i;x++){
         for(y=0;y< j;y++){
            cout << l[x][y]<< " ";
        }
        cout << "\n";   
    }
    cout << "Area of maximum rectangle is "
    << maxRectangle(A); 
 return 0;   
}
        

共有1个答案

连曜灿
2023-03-14

该行:

int A[][MAXCOL] = { l[p][q]};

声明A并将l[p][q]分配给第一个元素,并将其他所有元素归零。您需要一个循环来将l复制到A。更好的是,使用std::向量而不是具有最大大小的静态数组

 类似资料:
  • 下面是二进制矩阵最大面积的代码。它有一个函数MAH()来返回直方图的最大面积。方法是将二进制矩阵(2d)分解为一维。然后将MAH()应用于每个一维数组并找到最大面积。 类解决方案{ 问题链接:二进制矩阵的最大面积 MAH()函数是正确的。仅maximalRectangle(char[][]矩阵)函数无法给出结果。有人能解释一下吗?? 这是另一个人发布的maximalRectangle(char[]

  • 给定一个2维正整数数组,求和最大的HxW子矩形。矩形的总和是该矩形中所有元素的总和。 输入:具有正元素的二维数组NxN子矩形的HxW大小 输出:HxW大小的子矩阵,其元素的总和最大。 我已经使用蛮力方法解决了这个问题,但是,我现在正在寻找一个具有更好复杂性的更好的解决方案(我的蛮力法的复杂性是O(n6))。

  • 我有一个大的NxN位数组,有K个1(其他都是0)。所有非零点的坐标都是已知的——换句话说,这个n×n数组可以表示为K对数组,每个数组包含一个非零点的x和y坐标。 给定一个HxW大小的子矩阵,我需要将其放在我的原始NxN数组上,使其覆盖大多数非零点。 输入:子矩阵的高度H和宽度W 输出:HxW子数组的x和y协弦,其内部有最多的协弦 之前也回答过类似的问题:2D矩阵中尺寸为HxW的最大子阵列,但在我的

  • 这是一个面试问题。 我们被赋予各种矩形的尺寸,我们必须找出可以包围所有矩形的矩形面积(最小值)?矩形也可以旋转。 在将矩形拟合到最小可能区域之前,我曾问过一个类似的问题。 上述方法考虑了所有可能性、旋转,并在所有布局情况下确定了所有此类可能性的最小值<我们不能先求矩形面积之和,然后再求最大长度、最大宽度吗?

  • 我实现了c程序,可以找到矩阵的元素:行的最大元素,同时列的最小元素,或行的-min元素,同时列的最大元素。例如,我们有数据。包含以下内容的txt文件: 4 7 8 9 10 6 5 4 11 5 0 1 12 4 2 7 13- 其中4是n-矩阵大小(4x4),7和10是这些数字。 下面是代码: 问题:我想知道我的代码是不是“脏”代码?因为我总是渴望让一切变得如此困难,只要有可能让它变得容易。是否

  • 假设我有一组矩形(维度不同或相同)。 任务是从集合中查找(并删除)大于或等于给定矩形的矩形 它也应该是集合中可以包含给定矩形的最小矩形 这很容易通过线性搜索/更新在O(n)时间内解决,但是有可能获得更好的结果吗?我认为O(log n)是最佳值。Insert和removal也必须比O(n)快,这样在我的例子中才有用。 是否可以通过不找到最佳矩形来制定任何快捷方式,而是将第二个限制放宽为:“它也应该是