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

การหาเมทริกซ์ย่อยกำลังสองสูงสุดที่มีองค์ประกอบเท่ากันทั้งหมดใน C++


ในปัญหานี้ เราได้รับเมทริกซ์เมทริกซ์ N*N[] งานของเราคือ การหาเมทริกซ์ย่อยกำลังสองสูงสุดที่มีองค์ประกอบเท่ากันทั้งหมด .

ในปัญหานี้ เราจำเป็นต้องค้นหาขนาดสูงสุดของเมทริกซ์ย่อยจากเมทริกซ์ที่กำหนดซึ่งมีองค์ประกอบทั้งหมดเหมือนกัน

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

Input: mat[][] = {{1, 2, 1}, {1, 2, 2}, {2, 2, 2}}
Output: 2

คำอธิบาย

matrix a11, a12, a21, a22 is of size 2X2 and forms a sub-matrix with all equal elements.

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

วิธีแก้ปัญหาอย่างง่ายคือการข้ามองค์ประกอบทั้งหมดของเมทริกซ์ แล้วตรวจสอบเมทริกซ์ย่อยทั้งหมดที่มีองค์ประกอบเดียวกัน ความซับซ้อนของเวลาของอัลกอริทึมคือ O(n 3 ) และเมทริกซ์ย่อยแต่ละรายการถูกสร้างขึ้นด้วยความซับซ้อนของเวลาของ O(n 2 )

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

หากเพื่อนบ้านขององค์ประกอบเหมือนกันทั้งหมด เราจะเพิ่มค่าของเมทริกซ์ย่อยที่ยาวที่สุด ในกรณีนี้ ,

$DP[i][j]\:=\:min(DP[i-1][j] , DP[i][j-1], DP[i-1][j-1]) + 1$

หากไม่เป็นเช่นนั้น

DP[i][j] =1

ตัวอย่าง

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

#include<bits/stdc++.h>
#define n 4
#define m 4
using namespace std;
int findmaxSqMatSize(int mat[][m]){
   int DP[n][m];
   memset(DP, sizeof(DP), 0);
   int maxSqMatSize = 0;
   for (int i = 0 ; i < n ; i++){
      for (int j = 0 ; j < m ; j++){
         if (i == 0 || j == 0)
            DP[i][j] = 1;
         else{
            if (mat[i][j] == mat[i-1][j] && mat[i][j] == mat[i][j-1] && mat[i][j] == mat[i-1][j-1] )
               DP[i][j] = min(min(DP[i-1][j], DP[i][j-1]), DP[i-1][j-1] ) + 1;
            else DP[i][j] = 1;
         }
         maxSqMatSize = max(maxSqMatSize, DP[i][j]);
      }
   }
   return maxSqMatSize;
}
int main(){
   int mat[n][m] = { {2, 1, 4, 3},
   {5, 1, 1, 7},
   {1, 1, 1, 4},
   {9, 4, 6, 0}};
   cout<<"The maximum square sub-matrix with all equal elements is "<<findmaxSqMatSize(mat);
   return 0;
}

ผลลัพธ์

The maximum square sub-matrix with all equal elements is 2