Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เมทริกซ์ย่อยไบนารีสี่เหลี่ยมผืนผ้าขนาดสูงสุดที่มีทั้งหมด 1 วินาทีใน C++ Program


ในปัญหานี้ เราได้รับ 2-D matrix bin[][] ขนาด n*m ที่มีเลขฐานสองออนไลน์เช่น 0/1 งานของเราคือสร้างโปรแกรมเพื่อค้นหาเมทริกซ์ย่อยไบนารีของสี่เหลี่ยมขนาดสูงสุดที่มีทั้งหมด 1 วินาทีและส่งคืนพื้นที่สูงสุด

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

อินพุต

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

ผลลัพธ์

12

คำอธิบาย

สำหรับสี่เหลี่ยมนี้ พื้นที่ที่มีค่าสูงสุด

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

แนวทางการแก้ปัญหา

ในการแก้ปัญหา เราต้องหาเมทริกซ์ย่อยสี่เหลี่ยมที่ใหญ่ที่สุดที่เป็นไปได้ซึ่งประกอบด้วย 1 เท่านั้น และสำหรับสิ่งนี้ เราต้องหาพื้นที่สูงสุดจนกว่าแถวปัจจุบันจะสร้างด้วยสี่เหลี่ยมผืนผ้า

พื้นที่จนถึงแถวปัจจุบันจะคำนวณโดยหาจำนวนที่ต่อเนื่องกันจนถึงองค์ประกอบปัจจุบันในคอลัมน์ก่อน และเราจะพิจารณาองค์ประกอบที่มีจำนวนเท่ากันหรือมากกว่าหนึ่งครั้ง เช่น หากทั้งหมดมีจำนวนต่างกัน เราจะพิจารณาจำนวนที่น้อยที่สุด แถวที่มีพื้นที่มากที่สุดจะเป็นผลลัพธ์

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#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;
}

ผลลัพธ์

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