Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में मैट्रिक्स में समान मान वाले k×k सबमैट्रिक्स ढूंढने का प्रोग्राम

समस्या विवरण

मान लीजिए हमारे पास एक 2D मैट्रिक्स है, हमें सबसे बड़ा k×k सबमैट्रिक्स ढूंढना है जहां सभी तत्वों का मान समान हो, और फिर k का मान ज्ञात करना है।

उदाहरण के लिए, यदि इनपुट मैट्रिक्स है:

1183
1555
2555
4555

तो आउटपुट 3 होगा, क्योंकि मान 5 का एक 3×3 वर्ग सबमैट्रिक्स मौजूद है।

हल करने का दृष्टिकोण

इस समस्या को हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:

  1. n := मैट्रिक्स की पंक्तियों की संख्या
  2. m := मैट्रिक्स के स्तंभों की संख्या
  3. आकार n×m का एक 2D DP ऐरे परिभाषित करें और इसे 1 से भरें
  4. ret := 1
  5. i := n-1 से 0 तक (घटते क्रम में):
    • j := m-1 से 0 तक (घटते क्रम में):
      • val := अनंत
      • यदि i+1 < n और v[i+1][j] == v[i][j], तो val := min(dp[i+1][j], val), अन्यथा val := 0
      • यदि j+1 < m और v[i][j+1] == v[i][j], तो val := min(dp[i][j+1], val), अन्यथा val := 0
      • यदि i+1 < n और j+1 < m और v[i+1][j+1] == v[i][j], तो val := min(dp[i+1][j+1], val), अन्यथा val := 0
      • यदि val अनंत के बराबर है, तो अगले इटरेशन पर जाएं
      • dp[i][j] := dp[i][j] + val
      • ret := max(ret, dp[i][j])
  6. ret वापस करें

उदाहरण

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int solve(vector<vector<int>>& v) {
        int n = v.size();
        int m = v[0].size();
        vector<vector<int>> dp(n, vector<int>(m, 1));
        int ret = 1;
        
        for (int i = n - 1; i >= 0; i--) {
            for (int j = m - 1; j >= 0; j--) {
                int val = INT_MAX;
                if (i + 1 < n && v[i + 1][j] == v[i][j]) 
                    val = min(dp[i + 1][j], val);
                else 
                    val = 0;
                
                if (j + 1 < m && v[i][j + 1] == v[i][j]) 
                    val = min(dp[i][j + 1], val);
                else 
                    val = 0;
                
                if (i + 1 < n && j + 1 < m && v[i + 1][j + 1] == v[i][j]) 
                    val = min(dp[i + 1][j + 1], val);
                else 
                    val = 0;
                
                if (val == INT_MAX) continue;
                dp[i][j] += val;
                ret = max(ret, dp[i][j]);
            }
        }
        return ret;
    }
};

int solve(vector<vector<int>>& matrix) {
    return (new Solution())->solve(matrix);
}

int main() {
    vector<vector<int>> matrix = {
        {1, 1, 8, 3},
        {1, 5, 5, 5},
        {2, 5, 5, 5},
        {4, 5, 5, 5}
    };
    cout << solve(matrix);
}

इनपुट

{{1, 1, 8, 3}, {1, 5, 5, 5}, {2, 5, 5, 5}, {4, 5, 5, 5}};

आउटपुट

3
  1. - C++ में किसी कैरेक्टर का ASCII मान खोजने का प्रोग्राम

    ASCII (अमेरिकन स्टैंडर्ड कोड फॉर इंफॉर्मेशन इंटरचेंज) टेबल में 128 कैरेक्टर्स होते हैं जिनके मान 0 से 127 तक होते हैं। विभिन्न कैरेक्टर्स के कुछ ASCII मान निम्नलिखित हैं: कैरेक्टर ASCII मान A 65 a 97 Z 90 z 122 $ 36 & 38 ? 63 किसी कैरेक्टर का ASCII मान खोजने का एक प्रोग्राम

  1. - दिए गए मैट्रिक्स में 1 के सबसे बड़े वर्ग का क्षेत्रफल ज्ञात करने का पायथन प्रोग्राम

    मान लीजिए हमारे पास एक बाइनरी मैट्रिक्स है, हमें उस दिए गए मैट्रिक्स में 1 के सबसे बड़े वर्ग को ढूंढना है। उदाहरण के लिए, यदि इनपुट इस तरह है: 100001100000110111100011110001111000111100 तो आउटपुट 16 होगा। इसे हल करने के लिए, हम निम्न चरणों का पालन करेंगे: res := 0 i को 0 से मैट्रिक्स के आकार तक के

  1. - पायथन में दी गई मैट्रिक्स में टार्गेट वैल्यू मौजूद है या नहीं जांचने का प्रोग्राम

    मान लीजिए हमारे पास एक 2D मैट्रिक्स है, जहां प्रत्येक पंक्ति और कॉलम नॉन-डिक्रीजिंग क्रम में सॉर्टेड है, हमें जांचना है कि दिया गया टार्गेट इसके अंदर मौजूद है या नहीं।उदाहरण के लिए, यदि इनपुट मैट्रिक्स है:243034316632और टार्गेट = 31, तो आउटपुट True होगा।समाधान दृष्टिकोणइसे हल करने के लिए हम निम्नलिख