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

C++ में अनक्रॉस्ड लाइन्स (Uncrossed Lines)


मान लीजिए हमने A और B के पूर्णांकों को (दिए गए क्रम में) दो अलग-अलग क्षैतिज रेखाओं पर लिखा है। अब, हम कनेक्टिंग लाइनें खींच सकते हैं: A[i] और B[j] को जोड़ने वाली एक सीधी रेखा जैसे कि:

  • A[i] == B[j];

  • खींची गई रेखा किसी अन्य कनेक्टिंग (गैर-क्षैतिज) रेखा को प्रतिच्छेद नहीं करती।

ध्यान रखें कि कनेक्टिंग लाइनें एंडपॉइंट्स पर भी प्रतिच्छेद नहीं कर सकतीं - प्रत्येक संख्या केवल एक कनेक्टिंग लाइन से संबंधित हो सकती है। अधिकतम कनेक्टिंग लाइनों की संख्या खोजें।

उदाहरण के लिए, यदि इनपुट [1,4,2] और [1,2,4] है, तो आउटपुट 2 होगा।

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

  1. एक solve() विधि परिभाषित करें जो i, j, ऐरे A, B और मैट्रिक्स dp लेती है

  2. यदि i या j सीमा से बाहर है तो 0 लौटाएं

  3. nj := j से शुरू करके B में A[i] खोजें

  4. पाए जाने पर temp := 1, अन्यथा 0

  5. ret := max(solve(i+1, j), temp + solve(i+1, nj+1)) की गणना करें

  6. dp[i][j] := ret स्टोर करें और लौटाएं

  7. मुख्य विधि से dp मैट्रिक्स बनाकर solve(0, 0) कॉल करें

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

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

class Solution { 
public: 
    int solve(int i, int j, vector<int>& A, vector<int>& B, vector<vector<int>>& dp){ 
        if(i >= A.size()) return 0; 
        if(j >= B.size()) return 0; 
        if(dp[i][j] != -1) return dp[i][j]; 
        int nj = j; 
        while(nj < B.size() && B[nj] != A[i]) nj++; 
        int ret = max(solve(i + 1, j, A, B, dp), (nj < B.size() ? 1 : 0) + solve(i + 1, nj + 1, A, B, dp)); 
        return dp[i][j] = ret; 
    } 
    
    int maxUncrossedLines(vector<int>& A, vector<int>& B) { 
        int n = A.size(); 
        int m = B.size(); 
        vector<vector<int>> dp(n, vector<int>(m, -1)); 
        return solve(0, 0, A, B, dp); 
    } 
}; 

int main(){ 
    vector<int> v1 = {1,4,2}; 
    vector<int> v2 = {1,2,4}; 
    Solution ob; 
    cout << (ob.maxUncrossedLines(v1, v2)); 
    return 0; 
}

इनपुट

[1,4,2] [1,2,4]

आउटपुट

2
  1. C++ में सरणी में क्रॉस लाइन्स की गिनती C++ में सरणी में क्रॉस लाइन्स की गिनती

    हमें विशिष्ट तत्वों की एक असॉर्टेड सरणी दी गई है। लक्ष्य सरणी के क्रमबद्ध होने के बाद क्रॉस लाइन्स ढूंढना है। क्रॉस लाइन्स को नीचे दिखाए अनुसार गिना जाता है - Arr[]={ 1,2,4,3,5 } यहां 3 क्रॉस लाइन्स हैं जैसा कि नीचे दिखाया गया है Arr[]= { 1,2,3,4,5 }. कोई क्रॉस लाइन्स नहीं क्योंकि सरणी पहले से क

  1. C++ में दो रेखाओं के प्रतिच्छेदन बिंदु के लिए प्रोग्राम C++ में दो रेखाओं के प्रतिच्छेदन बिंदु के लिए प्रोग्राम

    दिए गए बिंदु A और B रेखा AB के अनुरूप हैं और बिंदु P और Q रेखा PQ के अनुरूप हैं; कार्य इन दो रेखाओं के बीच प्रतिच्छेदन बिंदु को खोजना है।नोट − बिंदु X और Y निर्देशांकों पर 2D तल में दिए गए हैं।यहां A(a1, a2), B(b1, b2) और C(c1, c2), D(d1, d2) वे निर्देशांक हैं जो दो अलग-अलग रेखाएं बनाते हैं और

  1. - C++ में आइडेंटिफायर

    C++ आइडेंटिफायर एक नाम है जिसका उपयोग वेरिएबल, फ़ंक्शन, क्लास, मॉड्यूल, या किसी अन्य उपयोगकर्ता-परिभाषित आइटम की पहचान के लिए किया जाता है। एक आइडेंटिफायर A से Z या a से z तक के अक्षर या अंडरस्कोर (_) से शुरू होता है जिसके बाद शून्य या अधिक अक्षर, अंडरस्कोर, और अंक (0 से 9) आ सकते हैं। C++ आइडेंटिफ