ในปัญหานี้ เราได้รับเมทริกซ์เมทริกซ์ 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