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

C++ में मैट्रिक्स में लगातार एक की सबसे लंबी लाइन

मान लीजिए कि हमारे पास एक बाइनरी मैट्रिक्स एम है, हमें उस मैट्रिक्स में लगातार एक की सबसे लंबी लाइन ढूंढनी है। रेखा क्षैतिज, लंबवत, विकर्ण या विरोधी विकर्ण हो सकती है।

तो, अगर इनपुट पसंद है

0 1 1 0
0 1 1 0
0 0 0 1

तो आउटपुट 3

. होगा

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • रिट:=0

  • n :=M की पंक्ति

  • एम :=एम का कॉलम

  • क्रम n x m x 4 के एक 3D सरणी dp को परिभाषित करें

  • इनिशियलाइज़ करने के लिए मैं :=0, जब i

    • इनिशियलाइज़ j :=0 के लिए, जब j <4, अपडेट करें (j को 1 से बढ़ाएँ), करें -

      • डीपी [0, आई, जे]:=एम [0, आई]

      • ret :=अधिकतम रिट और dp[0, i, j]

  • इनिशियलाइज़ j :=0 के लिए, जब j

    • यदि M[0, j] शून्य नहीं है और j> 0 है, तो -

      • डीपी [0, जे, 1]:=1 + डीपी [0, जे - 1, 1]

      • रिट:=अधिकतम रिट और डीपी [0, जे, 1]

  • इनिशियलाइज़ करने के लिए मैं :=1, जब i

    • इनिशियलाइज़ j :=0 के लिए, जब j

      • dp[i, j, 0] :=(यदि M[i, j] गैर-शून्य है, तो 1 + dp[i - 1, j, 0], अन्यथा 0)

      • अगर j> 0, तो -

        • dp[i, j, 1] :=(यदि M[i, j] गैर-शून्य है, तो dp[i, j - 1, 1] + 1, अन्यथा 0)

        • dp[i, j, 2] :=(यदि M[i, j] गैर-शून्य है, तो dp[i - 1, j-1, 2] + 1, अन्यथा 0)

      • अन्यथा

        • dp[i, j, 1] :=M[i, j]

        • dp[i, j, 2]:=M[i, j]

      • यदि j + 1

        • dp[i, j, 3] :=(यदि M[i, j] गैर-शून्य है, तो dp[i - 1, j + 1, 3] + 1, अन्यथा 0)

      • अन्यथा

        • डीपी [आई, जे, 3]:=एम [आई, जे]

      • इनिशियलाइज़ k :=0 के लिए, जब k <4, अपडेट करें (1 से k बढ़ाएँ), करें -

        • ret :=अधिकतम रिट और dp[i, j, k]

  • वापसी रिट

उदाहरण

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int longestLine(vector<vector<int>>& M) {
      int ret = 0;
      int n = M.size();
      int m = !n ? 0 : M[0].size();
      vector<vector<vector<int> > > dp(n, vector<vector<int> >(m, vector<int>(4)));
      for (int i = 0; i < m; i++) {
         for (int j = 0; j < 4; j++) {
            dp[0][i][j] = M[0][i];
            ret = max(ret, dp[0][i][j]);
         }
      }
      for (int j = 0; j < m; j++) {
         if (M[0][j] && j > 0) {
            dp[0][j][1] = 1 + dp[0][j - 1][1];
            ret = max(ret, dp[0][j][1]);
         }
      }
      for (int i = 1; i < n; i++) {
         for (int j = 0; j < m; j++) {
            dp[i][j][0] = M[i][j] ? 1 + dp[i - 1][j][0] : 0;
            if (j > 0) {
               dp[i][j][1] = M[i][j] ? dp[i][j - 1][1] + 1 : 0;
               dp[i][j][2] = M[i][j] ? dp[i - 1][j - 1][2] + 1 : 0;
            }
            else {
               dp[i][j][1] = M[i][j];
               dp[i][j][2] = M[i][j];
            }
            if (j + 1 < m) {
               dp[i][j][3] = M[i][j] ? dp[i - 1][j + 1][3] + 1 : 0;
            }
            else {
               dp[i][j][3] = M[i][j];
            }
            for (int k = 0; k < 4; k++) {
               ret = max(ret, dp[i][j][k]);
            }
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{0,1,1,0},{0,1,1,0},{0,0,0,1}};
   cout << (ob.longestLine(v));
}

इनपुट

{{0,1,1,0},{0,1,1,0},{0,0,0,1}}

आउटपुट

3

  1. C++ . में रेखा परावर्तन

    मान लीजिए कि हमारे पास 2D तल पर n बिंदु हैं, हमें यह जांचना है कि क्या y-अक्ष के समानांतर कोई रेखा है जो दिए गए बिंदुओं को सममित रूप से दर्शाती है, दूसरे शब्दों में, जांचें कि क्या कोई ऐसी रेखा मौजूद है जो दी गई रेखा पर सभी बिंदुओं को प्रतिबिंबित करने के बाद मूल बिंदुओं का सेट वही होता है जो प्रतिबि

  1. C++ में विरल मैट्रिक्स गुणन

    मान लीजिए कि हमारे पास दो आव्यूह A और B हैं, हमें AB का परिणाम ज्ञात करना है। हम मान सकते हैं कि A की कॉलम संख्या B की पंक्ति संख्या के बराबर है। तो, अगर इनपुट [[1,0,0], [-1,0,3]] [[7,0,0], [0,0,0], [0,0,1]] जैसा है , 1 0 0 -1 0 3 7 0 0 0 0 0 0 0 1 तो आउटपुट [[7,0,0],[-7,0,3]] . होगा 7

  1. C++ में बाइनरी ट्री सबसे लंबे समय तक लगातार अनुक्रम

    मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें यह जांचना होगा कि क्या हम सबसे लंबे क्रमागत अनुक्रम पथ की लंबाई ज्ञात कर सकते हैं। यदि पथ माता-पिता-बच्चे कनेक्शन के साथ पेड़ में किसी भी नोड से कुछ शुरुआती नोड से नोड्स के किसी अनुक्रम को संदर्भित करता है। माता-पिता से बच्चे तक लगातार सबसे लंबे रास्ते की