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

C++ में 2D मैट्रिक्स में अधिकतम योग आयत (DP-27)


एक 2D मैट्रिक्स दिया गया है, उस उपमैट्रिक्स (आयत) को ढूंढें जिसके तत्वों का योग अधिकतम हो।

यह क्लासिक कडेन के एल्गोरिदम का 2D विस्तार है।

समाधान दृष्टिकोण

  1. सभी बाएं कॉलम जोड़ियों (left, right) के लिए पुनरावृति करें।
  2. प्रत्येक जोड़ी के लिए, प्रत्येक पंक्ति का योग temp[row] में संचित करें।
  3. इस 1D सरणी temp पर कडेन का एल्गोरिदम लागू करके अधिकतम योग उपसरणी खोजें।
  4. सभी जोड़ियों के लिए अधिकतम ट्रैक करें।

C++ कार्यान्वयन

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

#define ROW 4
#define COL 5

int kadane(int* arr, int* start, int* finish, int n) {
    int sum = 0, maxSum = INT_MIN, i;
    *finish = -1;
    int local_start = 0;
    for (i = 0; i < n; ++i) {
        sum += arr[i];
        if (sum < 0) { sum = 0; local_start = i + 1; }
        else if (sum > maxSum) { maxSum = sum; *start = local_start; *finish = i; }
    }
    if (*finish != -1) return maxSum;
    maxSum = arr[0]; *start = *finish = 0;
    for (i = 1; i < n; i++)
        if (arr[i] > maxSum) { maxSum = arr[i]; *start = *finish = i; }
    return maxSum;
}

void findMaxSum(int M[][COL]) {
    int maxSum = INT_MIN, finalLeft, finalRight, finalTop, finalBottom;
    int left, right, i;
    int temp[ROW], sum, start, finish;
    for (left = 0; left < COL; ++left) {
        memset(temp, 0, sizeof(temp));
        for (right = left; right < COL; ++right) {
            for (i = 0; i < ROW; ++i) temp[i] += M[i][right];
            sum = kadane(temp, &start, &finish, ROW);
            if (sum > maxSum) {
                maxSum = sum;
                finalLeft = left; finalRight = right;
                finalTop = start; finalBottom = finish;
            }
        }
    }
    cout << "(Top, Left) (" << finalTop << ", " << finalLeft << ")" << endl;
    cout << "(Bottom, Right) (" << finalBottom << ", " << finalRight << ")" << endl;
    cout << "Max sum is: " << maxSum << endl;
}

int main() {
    int M[ROW][COL] = {
        {1, 2, -1, -4, -20},
        {-8, -3, 4, 2, 1},
        {3, 8, 10, 1, 3},
        {-4, -1, 1, 7, -6}
    };
    findMaxSum(M);
    return 0;
}

आउटपुट

(Top, Left) (1, 1) (Bottom, Right) (3, 3) Max sum is: 29
  1. - C++ में मैट्रिक्स में अधिकतम पथ योग

    इस समस्या में, हमें M*N आकार का एक 2D मैट्रिक्स दिया गया है। हमारा कार्य एक प्रोग्राम बनाना है जो मैट्रिक्स में अधिकतम पथ योग ढूंढेगा।यहां, मैट्रिक्स में अधिकतम पथ योग को एक पंक्ति से अंतिम पंक्ति तक सभी तत्वों के योग के रूप में परिभाषित किया गया है। पथ को पार करने के लिए अनुमत चालें नीचे की ओर और व

  1. - C++ में त्रिभुज में अधिकतम पथ योग

    इस समस्या में, हमें संख्याएँ त्रिभुज के रूप में दी गई हैं। हमारा कार्य एक प्रोग्राम बनाना है जो त्रिभुज में अधिकतम पथ योग ढूंढेगा। तत्वों को पहली पंक्ति से 1 तत्व के साथ व्यवस्थित किया जाता है और फिर अगली पंक्तियों में तत्वों की बढ़ती संख्या के साथ जब तक nवीं पंक्ति में तत्व नहीं होते। इसलिए, प्रोग

  1. - C++ का उपयोग करके मैट्रिक्स में अधिकतम योग वाला कॉलम खोजें

    मान लीजिए हमारे पास M x N आकार का एक मैट्रिक्स है। हमें वह कॉलम ढूंढना है जिसका योग अधिकतम है। इस प्रोग्राम में हम किसी ट्रिकी दृष्टिकोण का पालन नहीं करेंगे, बल्कि सरणी को कॉलम-वार पार करेंगे, प्रत्येक कॉलम का योग प्राप्त करेंगे, और यदि योग अधिकतम है, तो उस योग और कॉलम इंडेक्स को प्रिंट करेंगे। उदा