【问题标题】:Maximum size rectangle binary sub-matrix with all 1s全为 1 的最大大小矩形二进制子矩阵
【发布时间】:2020-10-19 20:07:29
【问题描述】:

我使用直方图解决方案编写了这段代码,但用户不会在代码上输入矩阵,而是输入它的矩阵。现在我知道我做错了什么,除了直方图的数学之外,一切似乎都有效。我做错了什么?

用户将输入行和列,然后逐一输入矩阵中的每个值。然后代码将显示矩阵并计算所有 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;   
}
        

【问题讨论】:

  • 代码有什么问题?输出是什么,预期输出是什么?
  • float l[i][j]; -- 这不是合法的 C++。
  • 在代码中没有任何 cmets,并且只有对您想要实现的目标的模糊描述,因此很难就您可能出错的地方提供任何有用的反馈。我确实想知道您是否真的打算在 maxRectangle 函数中修改您的“矩阵”,这会使每一行成为其上方每一行的累积总和。
  • 小心#include &lt;bits/stdc++.h&gt;。 bits 文件夹中的内容不打算直接包含在内,也不提供任何保证。

标签: c++ math matrix histogram


【解决方案1】:

这一行:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 2017-02-17
    • 2018-01-21
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多