এই সমস্যায়, আমাদের nXm আকারের একটি বাইনারি ম্যাট্রিক্স বিন [][][] দেওয়া হয়েছে। আমাদের কাজ হল সমস্ত q প্রশ্নের সমাধান করা। কোয়েরির জন্য(x, y), আমাদেরকে x*x আকারের সাবম্যাট্রিক্সের সংখ্যা খুঁজে বের করতে হবে যাতে অ্যারের y (বাইনারী সংখ্যা) এর সমস্ত উপাদান।
সমস্যা বর্ণনা
এখানে, আমাদের একটি প্রদত্ত আকারের সাব-ম্যাট্রিক্সের মোট সংখ্যা গণনা করতে হবে যা শুধুমাত্র দুটি বিটের মধ্যে একটি নিয়ে গঠিত অর্থাৎ সাব-ম্যাট্রিক্সের সমস্ত উপাদান 0/1 হবে৷
সমস্যাটি বোঝার জন্য একটি উদাহরণ নেওয়া যাক,
ইনপুট
n = 3 , m = 4
bin[][] = {{ 1, 1, 0, 1}
{ 1, 1, 1, 0}
{ 0, 1, 1, 1}}
q = 1
q1 = (2, 1) আউটপুট
2
ব্যাখ্যা
সমস্ত উপাদান 1 সহ সাইজ 2 এর সমস্ত সাব-ম্যাট্রিক্স হল −
{{ 1, 1, 0, 1}
{ 1, 1, 1, 0}
{ 0, 1, 1, 1}}
{{ 1, 1, 0, 1}
{ 1, 1, 1, 0}
{ 0, 1, 1, 1}} এই সমস্যার সমাধান হল ডাইনামিক প্রোগ্রামিং ব্যবহার করা পন্থা সমাধান করতে, আমরা একই বিটের বৃহত্তম সাবম্যাট্রিক্স সংরক্ষণ করতে একটি 2D ম্যাট্রিক DP[][] বজায় রাখব। অর্থাৎ DP[i][j] সাব-ম্যাট্রিক্সের মান সংরক্ষণ করবে যার শেষ সূচক (i, j), এবং সমস্ত উপাদান একই।
আপনার বোঝার জন্য, যদি DP[4][5] =2, bin[3][4], bin[3][5], bin[4][4] এবং bin[4][5] এর উপাদান একই হয় .
সুতরাং, DP[i][j] খোঁজার জন্য, আমাদের দুটি ক্ষেত্রে আছে −
কেস 1 − যদি i =0 orj =0 :DP[i][j] =1, শুধুমাত্র একটি সাব-ম্যাট্রিক্স সম্ভব হতে পারে।
কেস 2 − অন্যথায়, bin[i-(k-1)][j] =bin[i][j - (k-1)] …:এই ক্ষেত্রে DP[i][j] =min(DP[i][ j-1] , DP[i -1][j], DP[i-1][j-1] ) + 1. এটি আমাদের প্রয়োজন মত সাব-ম্যাট্রিক্সে অবদান রাখবে। সাধারণীকরণ করা যাক, k =2 এর ক্ষেত্রে, অর্থাৎ যদি আমরা 2X2 আকারের একটি সাব-ম্যাট্রিক্স বিবেচনা করি। তারপরে আমাদের পরীক্ষা করতে হবে bin[i][j] =bin[i] [j - 1] =bin[i- 1][j] =bin[i -1 ][j -1 ], যদি এটি সম্ভব হয় তারপর, আমরা k =2 এর জন্য DP[i][j] খুঁজে পাব।
কেস 2 শর্ত পূরণ না হলে, আমরা DP[i][j] =1 সেট করব, যা একটি ডিফল্ট মান হিসাবে বিবেচিত হতে পারে৷
DP[i][j]-এর এই মান একটি সেট বিট বা আনসেট বিটের জন্য হতে পারে। আমরা bin[i][j] এর মান পরীক্ষা করে দেখব যে k এর মানটি কোন সেট বা আনসেট মানগুলির অন্তর্গত। ফ্রিকোয়েন্সি খুঁজে বের করার জন্য, আমরা দুটি অ্যারে তৈরি করব, সাব-ম্যাট্রিক্সের ফ্রিকোয়েন্সি সংরক্ষণ করার জন্য শূন্য ফ্রিকোয়েন্সি যা 0-এর জন্য তৈরি হয়।
আমাদের সমাধানের কাজ চিত্রিত করার জন্য প্রোগ্রাম,
উদাহরণ
#include <iostream>
using namespace std;
#define N 3
#define M 4
int min(int a, int b, int c) {
if (a <= b && a <= c)
return a;
else if (b <= a && b <= c)
return b;
else
return c;
}
int solveQuery(int n, int m, int bin[N][M], int x, int y){
int DP[n][m], max = 1;
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 ((bin[i][j] == bin[i - 1][j]) && (bin[i][j] == bin[i][j - 1]) && (bin[i][j] == bin[i - 1][j - 1])) {
DP[i][j] = min(DP[i - 1][j], DP[i - 1][j - 1], DP[i][j - 1]) + 1;
if (max < DP[i][j])
max = DP[i][j];
}
else
DP[i][j] = 1;
}
}
int zeroFrequency[n+m] = { 0 }, oneFrequency[n+m] = { 0 };
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (bin[i][j] == 0)
zeroFrequency[DP[i][j]]++;
else
oneFrequency[DP[i][j]]++;
}
}
for (int i = max - 1; i >= 0; i--) {
zeroFrequency[i] += zeroFrequency[i + 1];
oneFrequency[i] += oneFrequency[i + 1];
}
if (y == 0)
return zeroFrequency[x];
else
return oneFrequency[x];
}
int main(){
int n = 3, m = 4;
int mat[N][M] =
{{ 1, 1, 0, 1},
{ 1, 1, 1, 0},
{ 0, 1, 1, 1}};
int Q = 2;
int query[Q][2] = {{ 2, 1}, { 1, 0}};
for(int i = 0; i < Q; i++){
cout<<"For Query "<<(i+1)<<": The number of Binary sub-matrices of Given size is " <<solveQuery(n, m, mat, query[i][0], query[i][1])<<"\n";
}
return 0;
} আউটপুট
For Query 1: The number of Binary sub-matrices of Given size is 2 For Query 2: The number of Binary sub-matrices of Given size is 3