Computer >> Máy Tính >  >> Lập trình >> C ++

Ma trận con nhị phân hình chữ nhật có kích thước tối đa với tất cả các số 1 trong Chương trình C ++

Trong bài toán này, chúng ta được cung cấp một bin ma trận 2-D [] [] có kích thước n * m chứa các số nhị phân trực tuyến, tức là 0/1. Nhiệm vụ của chúng tôi là tạo một chương trình để tìm ma trận con nhị phân hình chữ nhật có kích thước tối đa với tất cả các số 1 và trả về diện tích tối đa cho chúng.

Hãy lấy một ví dụ để hiểu vấn đề,

Đầu vào

bin[][] = {
   {1, 0, 1, 1, 1}
   {0, 1, 1, 1, 1}
   {0, 0, 1, 1, 1}
   {1, 1, 1, 1, 1}
}

Đầu ra

12

Giải thích

Đối với hình chữ nhật này, diện tích bằng tối đa.

1, 1, 1
1, 1, 1
1, 1, 1
1, 1, 1

Phương pháp tiếp cận giải pháp

Để giải quyết vấn đề này, chúng ta cần tìm một ma trận con hình chữ nhật lớn nhất có thể chỉ chứa 1 chữ cái. Và đối với điều này, chúng ta cần tìm diện tích tối đa cho đến khi hàng hiện tại được tạo bởi một hình chữ nhật.

Diện tích cho đến hàng hiện tại sẽ được tính bằng cách tìm số đầu tiên liên tiếp cho đến phần tử hiện tại trong cột. Và chúng tôi sẽ xem xét các phần tử có cùng số hoặc lớn hơn một lần tức là nếu tất cả có số khác nhau, chúng tôi sẽ xem xét phần tử nhỏ nhất. Hàng có diện tích lớn nhất cho đến nay sẽ là kết quả

Ví dụ

Chương trình minh họa hoạt động của giải pháp của chúng tôi,

#include <bits/stdc++.h>
using namespace std;
#define R 4
#define C 5
int calcAreaTillRow(int row[]){
   stack<int> area1s;
   int tos;
   int maxArea = 0;
   int curArea = 0;
   int i = 0;
   while (i < C) {
      if (area1s.empty() || row[area1s.top()] <= row[i])
         area1s.push(i++);
      else {
         tos = row[area1s.top()];
         area1s.pop();
         curArea = tos * i;
         if (!area1s.empty())
            curArea = tos * (i − area1s.top() − 1);
         maxArea = max(curArea, maxArea);
      }
   }
   while (!area1s.empty()) {
      tos = row[area1s.top()];
      area1s.pop();
      curArea = tos * i;
      if (!area1s.empty())
         curArea = tos * (i − area1s.top() − 1);
      maxArea = max(curArea, maxArea);
   }
   return maxArea;
}
int calcmaxRecSubMat1(int bin[][C]){
   int result = calcAreaTillRow(bin[0]);
   for (int i = 1; i < R; i++) {
      for (int j = 0; j < C; j++)
      if (bin[i][j])
         bin[i][j] += bin[i − 1][j];
      result = max(result, calcAreaTillRow(bin[i]));
   }
   return result;
}
int main(){
   int bin[][C] = {
      {1, 0, 1, 1, 1},
      {0, 1, 1, 1, 1},
      {0, 0, 1, 1, 1},
      {1, 1, 1, 1, 1}
   };
   cout<<"The area of maximum size rectangle binary sub−matrix with all 1s is "<<calcmaxRecSubMat1(bin);
   return 0;
}

Đầu ra

The area of maximum size rectangle binary sub-matrix with all 1s is 12